2016-09-26 4 views
2

ein kleine Daten wie die unten gesetzt Stellen Sie sich vor, bestehend aus drei Variablen:Die Anzahl der Zeilen mit einer bestimmten Anzahl von fehlenden Werten

v1 <- c(0, 1, NA, 1, NA, 0) 
v2 <- c(0, 0, NA, 1, NA, NA) 
v3 <- c(1, NA, 0, 0, NA, 0) 
df <- data.frame(v1, v2, v3) 

df 
    v1 v2 v3 
1 0 0 1 
2 1 0 NA 
3 NA NA 0 
4 1 1 0 
5 NA NA NA 
6 0 NA 0 

One den is.na Befehl verwenden kann, als die Zahl berechnen folgt mindestens einen fehlenden Wert von Reihen mit - und R 4 würde zurück:

sum(is.na(df$v1) | is.na(df$v2) | is.na(df$v3)) 

oder die Anzahl der Zeilen mit allen drei Werten fehlt - und R 1 würde zurück:

sum(is.na(df$v1) & is.na(df$v2) & is.na(df$v3)) 

Zwei Fragen an dieser Stelle:

(1) Wie kann ich die Anzahl der Zeilen berechnen, in denen "genau ein" oder "genau zwei" Werte fehlen?

(2) Wenn ich das Obige in einem großen Datensatz tun soll, wie kann ich den Umfang der Berechnung auf v1, v2 und v3 beschränken (dh ohne eine Teilmenge erstellen zu müssen)?

Ich versuchte Variationen von is.na, nrow und df, konnte aber keine von ihnen zur Arbeit bekommen.

Danke!

Antwort

3

Wir können rowSums auf der logischen Matrix (is.na(df)) verwenden und prüfen, ob die Anzahl der NAs gleich dem Wert von Interesse ist.

n1 <- 1 
sum(rowSums(is.na(df))==n1) 

Um es einfacher zu machen, erstellen Sie eine Funktion, dies zu tun

f1 <- function(dat, n){ 
      sum(rowSums(is.na(dat)) == n) 
     } 


f1(df, 0) 
#[1] 2 
f1(df, 1) 
#[1] 2 

f1(df, 3) 
#[1] 1 
f1(df, 2) 
#[1] 1 

HINWEIS: rowSums ist sehr schnell, aber wenn es eine große Datenmenge, dann eine logische Matrix erstellen, kann auch Probleme schaffen in Erinnerung. So können wir Reduce nach dem Durchlaufen der Spalten des Datasets verwenden (lapply(df, is.na)).

sum(Reduce(`+`, lapply(df, is.na))==1) 
#[1] 2 

f2 <- function(dat, n){ 
     sum(Reduce(`+`, lapply(dat, is.na))==n) 
} 

f2(df, 1) 
1

Try this:

num.rows.with.x.NA <- function(df, x, cols=names(df)) { 
    return(sum(apply(df, 1, function(y) sum(is.na(y[cols])) == x))) 
} 

df 

    v1 v2 v3 
1 0 0 1 
2 1 0 NA 
3 NA NA 0 
4 1 1 0 
5 NA NA NA 
6 0 NA 0 

num.rows.with.x.NA(df, 0, names(df)) 
#[1] 2 
num.rows.with.x.NA(df, 1, names(df)) 
#[1] 2 
num.rows.with.x.NA(df, 2, names(df)) 
#[1] 1 
num.rows.with.x.NA(df, 3, names(df)) 
#[1] 1 
+3

Sie sind hier das Rad in ineffiziente Art und Weise neu zu erfinden. R hat alle diese Funktionen vektorisiert –

+0

Ja, wir können rowSums/Reduce von akrun verwenden, wenn die Effizienz @David betrifft. –

Verwandte Themen