按行编辑数据

我正在尝试在 R 中转换我的数据,但我无法获得我想要的列。

我的数据集如下,我想得到的列是“total”,它是D1+D2+D3+D4+D5的总和,忽略“NA”。

NR D1 D2 D3 D4 D5 全部的
一种 1 不适用 不适用 1 不适用 2
不适用 不适用 不适用 不适用 不适用 不适用
C 不适用 1 不适用 不适用 不适用 1

回答

我们可以用 rowSums

df1$total <- rowSums(df1[startsWith(names(df1), "D")], na.rm = TRUE)
df1$total[df1$total == 0] <- NA

或者同样的逻辑 dplyr

library(dplyr)
df1 %>% 
   mutate(total = na_if(rowSums(select(., starts_with('D')), na.rm = TRUE), 0))
  NR D1 D2 D3 D4 D5 total
1  A  1 NA NA  1 NA     2
2  B NA NA NA NA NA    NA
3  C NA  1 NA NA NA     1

数据

df1 <- structure(list(NR = c("A", "B", "C"), D1 = c(1L, NA, NA), D2 = c(NA, 
NA, 1L), D3 = c(NA, NA, NA), D4 = c(1L, NA, NA), D5 = c(NA, NA, 
NA), total = c(2L, NA, 1L)), class = "data.frame", row.names = c(NA, 
-3L))


回答

这是一个解决方案c_acrossrowwise

library(dplyr)
  df %>%
    rowwise() %>% 
    mutate(Total = sum(c_across(D1:D5 & where(is.numeric)), na.rm = TRUE))

输出:

  NR       D1    D2 D3       D4 D5    Total
  <chr> <int> <int> <lgl> <int> <lgl> <int>
1 A         1    NA NA        1 NA        2
2 B        NA    NA NA       NA NA        0
3 C        NA     1 NA       NA NA        1

数据:

structure(list(NR = c("A", "B", "C"), D1 = c(1L, NA, NA), D2 = c(NA, 
NA, 1L), D3 = c(NA, NA, NA), D4 = c(1L, NA, NA), D5 = c(NA, NA, 
NA)), row.names = c(NA, -3L), class = "data.frame")


以上是按行编辑数据的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>