2016-07-07 3 views
12

Der Code ist wie dieserWarum liefert x [NA] einen NA-Vektor mit der gleichen Länge wie x?

x <- 1:5 
x[NA] 

Warum dauert es 5 NAs produzieren?

+16

Gute Frage. Versuchen Sie, sich selbst zu beantworten, indem Sie sehen, was 'x [TRUE]', 'x [FALSE]', 'class (NA)' und 'x [NA_integer_]' zurückgibt. – nicola

+10

'x [c (NA, WAHR)]' könnte auch aufschlussreich sein, da es explizit den Vektor zeigt, der sowohl einen "NA" - als auch einen "Nicht-NA" -Wert recycelt. – thelatemail

+6

Siehe ähnliche Beiträge [hier] (http://stackoverflow.com/questions/23406124/na-in-subsetter-inconsistent-behavior) und [hier] (http://stackoverflow.com/questions/16418689/how-is -true-interpretiert-wenn-verwendet-als-Matrix-Index) –

Antwort

13

Die Antwort auf diese Frage hat zwei Seiten:

Wie wird NA interpretiert, wenn Matrizen Indizierung?

In one of the links von @alexis_laz zur Verfügung gestellt, fand ich eine sehr gut strukturierte Erklärung, wie TRUE, FALSE und NA interpretiert werden, wenn Matrizen Indizieren:

Logical Indizes sagen R welche Elemente einschließen oder ausschließen.

Sie haben drei Möglichkeiten: TRUE, FALSE und NA

Sie dienen, um anzuzeigen, ob der in dieser Position dargestellt Index aufgenommen werden soll. Mit anderen Worten:

TRUE == "Include the elment at this index" 
FALSE == "Do not include the element at this index" 
NA == "Return NA instead of this index" # loosely speaking 

Zum Beispiel:

x <- 1:6 
x[ c(TRUE, FALSE, TRUE, NA, TRUE, FALSE)] 
# [1] 1 3 NA 5 

Ein wichtiges Detail ist, dass der Standard-Speichermodus für einen isolierten NA Wert logisch ist (versuchen typeof(NA)). Sie können den Speichermodus des NA mit NA_integer_, NA_real_ (für Doppel), NA_complex_ oder auswählen.

Warum 5 NA und nicht nur 1?

Wenn die Länge des Indizes kleiner ist als die Länge des Vektors x, wird die Indizierung über auch Index die Werte in x beginnen, die noch nicht indiziert sind. Mit anderen Worten: R wird die Indizes automatisch "recyceln":

(...) Es gelten jedoch die Standard-Recycling-Regeln. So im vorigen Beispiel, wenn wir das letzte FALSE, der Index Vektor fallen recycelt wird, ist das erste Element des Index ist TRUE und damit das sechste Element x jetzt

x <- 1:6 
x[c(TRUE, FALSE, TRUE, NA, TRUE)] 
# [1] 1 3 NA 5 6 

Recall das Detail enthalten ist über den Speichermodus aus dem vorherigen Abschnitt. Wenn Sie x[NA_integer_] eingeben, werden Sie ein anderes Ergebnis finden.

+3

Welche neuen Informationen liefert dies zur Antwort im 2. Link von alexis_laz? – Jaap

+4

Es werden keine Informationen hinzugefügt. Die Frage wartete auf eine Antwort und ich stellte die Informationen in den Kommentaren zusammen –

Verwandte Themen