2012-03-23 1 views
5

gefälschte Daten zur Veranschaulichung zählen:R: Wie kann ich über Variablen zusammenzufassen, in Fällen, während NA als Null

df <- data.frame(a=c(1,2,3,4,5), b=(c(2,2,2,2,NA)), 
       c=c(NA,2,3,4,5))) 

Dies würde erhalten mir die Antwort, die ich will, wenn es nicht für die NA-Werte waren:

df$count <- with(df, (a==1) + (b==2) + (c==3)) 

Würde es auch einen noch eleganteren Weg geben, wenn ich nur interessiert wäre, zB Variablen == 2?

df$count <- with(df, (a==2) + (b==2) + (c==2)) 

Vielen Dank!

+0

+1 für eine gute Frage und eine große Benutzernamen :) – Tommy

Antwort

5

Die folgenden Arbeiten für Ihr spezifisches Beispiel, aber ich habe den Verdacht, dass Ihr realer Anwendungsfall ist komplizierter:

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 

aber dieser allgemeine Ansatz funktionieren soll. Zum Beispiel würde Ihr zweites Beispiel so etwas wie diese:

df$count <- apply(df,1,function(x){sum(x == 2,na.rm = TRUE)}) 

oder allgemeiner könnten Sie lassen Sie sich in einer Variablen für den Vergleich passieren:

df$count <- apply(df,1,function(x,compare){sum(x == compare,na.rm = TRUE)},compare = 1:3) 
+0

Toll, das tut alles was ich brauche! –

2

Ein anderer Weg ist Ihren Zielvektor zu subtrahieren aus jeder Zeile Ihrer data.frame, negieren und dann tun rowSums mit 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 
+0

danke, dass du mir einen anderen Weg gezeigt hast :) –

Verwandte Themen