2012-03-23 5 views
5

가짜 데이터로 NA를 계산하는 동안은, 케이스 내에서 변수에 걸쳐 합계 수있는 방법 :R : 그림 제로

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

+1과 훌륭한 사용자 이름 : – Tommy

답변

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

좋아,이게 내가 필요한 모든 것을 해낼거야! –

2

또 다른 방법은 대상 벡터를 빼기하는 것입니다 당신의 data.frame의 각 행에서, 부정하고 할 rowSumsna.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 
+0

다른 방법을 보여 주셔서 고마워 :) –