5

用于说明的假数据:

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)) 

非常感谢!

4

2 回答 2

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)
于 2012-03-23T20:31:25.237 回答
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
于 2012-03-23T21:36:28.763 回答