假冒伪劣数据:
df <- data.frame(a=c(1,2,3,4,5), b=(c(2,2,2,2,NA)),
c=c(NA,2,3,4,5)))
如果不是NA值,这会得到我想要的答案:
df$count <- with(df, (a==1) + (b==2) + (c==3))
另外,如果我只对自己感兴趣,会有更优雅的方式,例如变量== 2?
df$count <- with(df, (a==2) + (b==2) + (c==2))
非常感谢!
答案 0 :(得分:5)
以下适用于您的具体示例,但我怀疑您的实际用例更复杂:
df$count <- apply(df,1,function(x){sum(x == 1:3,na.rm = TRUE)})
> df
a b c count
1 1 2 NA 2
2 2 2 2 1
3 3 2 3 2
4 4 2 4 1
5 5 NA 5 0
但这种一般方法应该有效。例如,你的第二个例子是这样的:
df$count <- apply(df,1,function(x){sum(x == 2,na.rm = TRUE)})
或更一般地说,您可以允许自己传入变量进行比较:
df$count <- apply(df,1,function(x,compare){sum(x == compare,na.rm = TRUE)},compare = 1:3)
答案 1 :(得分:2)
另一种方法是从data.frame的每一行中减去目标向量,否定然后使用rowSums
执行na.rm=TRUE
:
target <- 1:3
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE)
[1] 2 1 2 1 0
target <- rep(2,3)
rowSums(!(df-rep(target,each=nrow(df))),na.rm=TRUE)
[1] 1 3 1 1 0