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

しかし、この一般的なアプローチは機能するはずです。たとえば、2番目の例は次のようになります。

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

もう1つの方法は、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 に答える