【问题标题】:Sum across multiple columns跨多个列求和
【发布时间】:2017-05-05 02:45:18
【问题描述】:

我想这是一个非常基本的问题,但我有点迷茫。我有三个变量:A、B 和 C,范围为 0-4。我想计算等于 1 的总数,并用总和创建一个新变量。例如,如果变量 A 和 B 等于 1,则新变量 SumABC 将等于 2。我尝试使用 mutate 来执行此操作,但我知道必须有更简单的方法。

x <- mutate(z,
 SumABC = 
  ifelse(A == 1, 1, 
  ifelse(B ==1, 1, 
  ifelse(C ==1, 1, 
  ifelse(A ==1 & B ==1, 2,
  ifelse(A ==1 & C ==1, 2,
  ifelse(B ==1 & C ==1, 2,
  ifelse(A ==1 & B ==1 & C == 1, 3, 0))))))))

【问题讨论】:

  • 如果您向reproducible example 提供示例输入数据和所需输出以便测试可能的解决方案,则更容易提供帮助。
  • 对于名为 z 的 data.frame,可能类似于 rowSums(z[c("A","B","C")] == 1)

标签: r


【解决方案1】:

也许不是最复杂的,但它确实有效:

df <- data.frame(A=sample(0:4,10,replace = T),B=sample(0:4,10,replace = T),C=sample(0:4,10,replace = T))

df$EQ1 <- rowSums(df == 1)

# Output

df

   A B C EQ1
1  2 3 3   0
2  1 4 4   1
3  1 3 4   1
4  2 4 3   0
5  1 4 1   2
6  1 3 1   2
7  1 2 2   1
8  1 4 4   1
9  2 4 4   0
10 2 3 4   0

编辑:

或者,如果您更喜欢向量(相同大小):

vecs <- sapply(c('A','B','C'),function(x) sample(0:4,10,replace = T),simplify = F)

tsum <- (vecs$A == 1)*1 + (vecs$B == 1)*1 + (vecs$C == 1)*1

# output

> tsum
 [1] 0 0 1 0 0 0 0 1 0 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2019-12-11
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多