2016-07-20 30 views
0

Ich versuche zu zeigen, wie viele vollständige Beobachtungen gibt es pro Variabel ID ohne mit der complete.cases-Paket oder ein anderes Paket.zählen nicht-NA-Werte und gruppieren nach Variable

Wenn ich na.omit verwenden, um die NA-Werte herauszufiltern, werde ich alle IDs verlieren, die NULL vollständige Fälle haben könnten.

Am Ende würde ich eine Häufigkeitstabelle mit zwei Spalten wie: ID und Number of Complete Observations

> length(unique(data$ID)) 
[1] 332 

> head(data) 
    ID value 
1 1 NA 
2 1 NA 
3 1 NA 
4 1 NA 
5 1 NA 
6 1 NA 

> dim(data) 
[1] 772087  2 

Wenn ich versuche, meine eigene Funktion z zu schaffen - die Nicht-NA-Werte zählt und dann Anwendung, wenn in dem aggregate() Funktion, die IDs mit Null vollständige Beobachtungen sind weggelassen. Ich sollte mit 332 Zeilen belassen werden, nicht 323. Wie löst man das mit Basisfunktionen?

z <- function(x){ 
    sum(!is.na(x)) 
} 

aggregate(value ~ ID, data = data , FUN = "z") 

> nrow(aggregate(isna ~ ID, data = data , FUN = "z")) 
[1] 323 
+0

Können Sie Ihre Daten dput()? – mkt

+0

Keine schöne Lösung, aber Sie können alle NA-Werte gleich einer Zahl (z. B. 0 oder 9999999) setzen, die nicht in Ihrer "Wert" -Variable vorhanden ist. Zählen Sie die Anzahl der Beobachtungen ohne diese Zahl in ihrer Zeile. Und dann setzen Sie alle diese Zahlen zurück zu NA. – Marcel10

+1

'complete.cases' ist eine Funktion nicht ein Paket – Sotos

Antwort

2

Einer der Wege, dies zu tun, wird mit table:

df2 <- table(df$Id, !is.na(df$value))[,2] 
data.frame(ID = names(df2), value = df2) 

Daten

structure(list(Id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), value = c(NA, 
1, 1, 2, 2, NA, 3, NA, 3, 3, 4, 4)), .Names = c("Id", "value" 
), row.names = c(NA, -12L), class = "data.frame") 
1

Basis R können Sie Ihre Nutzenfunktion wie folgt verwenden:

stack(by(data$value, data$ID, FUN=function(x) sum(!is.na(x)))) 
0

können Sie direkt Tabelle für diesen Zweck verwenden. Unten ist der Beispielcode:

df1 <- structure(list(Id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), value = c(2, 
1, 1, NA, NA, NA, 3, NA, 3, 3, 4, 4)), .Names = c("Id", "value" 
), row.names = c(NA, -12L), class = "data.frame") 


df2 <- as.data.frame.matrix(with(df1, table(Id, value))) 
resultDf <- data.frame(Id=row.names(df2), count=apply(df2, 1, sum)) 
resultDf 

Der Code erstellt eine Tabelle mit ID und Wert. Dann summiert es nur die Nicht-Na-Werte aus der Tabelle. Hoffe, das ist leicht zu verstehen und hilft.