R如何做部分行和

时间:2015-07-31 01:44:16

标签: r sum sumifs

我是R的新手,我真诚地感谢你的帮助。

以下是我的数据的一部分:

subjectID  A B C D E F G H I J
S001       1 1 1 1 1 0 0
S002       1 1 1 0 0 0 0 

我想将从A到J的行相加,因此数据看起来像这样:

subjectID A B C D E F G H I J TOTAL
S001      1 1 1 1 1 0 0        5
S002      1 1 1 0 0 0 0        3

非常感谢你!如果变量A到J == 1,我想求和。

2 个答案:

答案 0 :(得分:1)

正如所建议的那样,我在这里发布我的答案。 这与apply一致。 df[-1]是要排除第一列(不是数字),x[x == 1]是要x的元素的子集(由于1的{​​{1}}适用)只有1的值。

 df$TOTAL <- apply(df[-1], 1, function(x) sum(x[x == 1], na.rm = T))

另一个(我打赌更快)并且更容易在基础R中编码方式是:

df$TOTAL <- rowSums(df[-1] == 1, na.rm = T)

这两个都有结果

df
  subjectID A B C D E F G  H  I  J TOTAL
1      S001 1 1 1 1 1 0 0 NA NA NA     5
2      S002 1 1 1 0 0 0 0 NA NA NA     3

数据

df <- structure(list(subjectID = structure(1:2, .Label = c("S001", 
"S002"), class = "factor"), A = c(1L, 1L), B = c(1L, 1L), C = c(1L, 
1L), D = c(1L, 0L), E = c(1L, 0L), F = c(0L, 0L), G = c(0L, 0L
), H = c(NA, NA), I = c(NA, NA), J = c(NA, NA)), .Names = c("subjectID", 
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), class = "data.frame", row.names = c(NA, 
-2L))

答案 1 :(得分:0)

SabDeM发布的另一个类似选项,但使用sapply仅对数字列求和

df$Total <- rowSums(df[ ,sapply(df, is.numeric)])

输出:

  subjectID A B C D E F G  H  I  J Total
1      S001 1 1 1 1 1 0 0 NA NA NA     5
2      S002 1 1 1 0 0 0 0 NA NA NA     3