2016-07-13 6 views
-1

Ich habe eine einfache Datenrahmen:R: zurück NA trotz is.na

> df <- data.frame(i=c(1:20), x=c(1:10, rep(NA, 10))) 
> df 
    i x 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 
7 7 7 
8 8 8 
9 9 9 
10 10 10 
11 11 NA 
12 12 NA 
13 13 NA 
14 14 NA 
15 15 NA 
16 16 NA 
17 17 NA 
18 18 NA 
19 19 NA 
20 20 NA 

Ich möchte die rownames der nicht NA Teile extrahieren, die ich tun kann, wie folgt:

> rownames(df[c(1:20),][!is.na(df$x),]) 
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" 

So weit so gut. Jetzt möchte ich die erste Zeile überspringen, aber aus irgendeinem Grund gibt der Befehl die gleiche Ausgabe zurück und enthält jetzt sogar eine NA-Zelle.

> rownames(df[c(2:20),][!is.na(df$x),]) 
[1] "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" 

Es macht keinen Sinn, einen Vektor gleicher Größe und sogar einen mit der angeblich ausgeschlossenen Zeile zu erhalten. Wie Sie im obigen Datenrahmen sehen können, ist df $ x [11] definitiv NA, also warum schließt es etwas ein, das! Is.na() normalerweise loswerden sollte? Um genauer zu sein: Ich versuche, einen Auszug eines Datenrahmens zu beobachten, aber Zeilen auszuschließen, die NAs enthalten. Ich würde mich über jeden Ratschlag freuen!

+4

in Bezug auf Ihren Code, vergessen Sie einfach zu filtern jedes Mal 'df' erscheint. Um es zum Laufen zu bringen, kannst du rownames machen (df [2:20,] [! Is.na (df [2:20,] $ x),]) 'oder' rownames (df [-1,] [! is.na (df [-1,] $ x),]) ' –

+0

Danke, das funktioniert eigentlich komplett mit meinem pupose. Ich habe tatsächlich vergessen, df im zweiten Teil zu spezifizieren/zu filtern! – oepix

+1

Der Grund dafür ist, dass es die rownames für die Datentabelle df [c (2:20),] die von 2 bis 20 sind (siehe rownames (df [c (2:20),]) und dann die die ersten 10 Werte von denen, die die "11" enthalten. Als Oberst erwähnte Rownames (df [c (2:20),] [! is.na (df [c (2:20),] $ x),]) funktioniert auch –

Antwort

2

Das Problem wird !is.na(df$x) zu df indiziert ist, nicht df[c(2:20) verwenden. !is.na(df$x) gilt für die ersten 10 Elemente. So gibt rownames(df[c(2:20),][!is.na(df$x),]) roownames für Elemente 2 bis 11 von df zurück.

df2 <- df[c(2:20),] 
rownames(df2[!is.na(df2$x),])  

# [1] "2" "3" "4" "5" "6" "7" "8" "9" "10" 
3

Wir extrahieren rownames direkt aus dem logischen Ausgang

tail(rownames(df)[!is.na(df$x)], -1) 
#[1] "2" "3" "4" "5" "6" "7" "8" "9" "10" 

Oder statt tail können wir

rownames(df)[!is.na(df$x)][-1] 
#[1] "2" "3" "4" "5" "6" "7" "8" "9" "10"