2016-07-07 13 views
12

Il codice è come questoPerché x [NA] produce un vettore NA della stessa lunghezza di x?

x <- 1:5 
x[NA] 

Perché si produce 5 NAS?

+16

Buona domanda. Cerca di risponderti vedendo cosa restituiscono 'x [TRUE]', 'x [FALSE]', 'class (NA)' e 'x [NA_integer_]'. – nicola

+10

'x [c (NA, TRUE)]' potrebbe anche essere illuminante, in quanto mostra esplicitamente il vettore che ricicla sia un valore 'NA' che non-'NA'. – thelatemail

+6

Vedi post simili [qui] (http://stackoverflow.com/questions/23406124/na-in-subsetter-inconsistent-behavior) e [qui] (http://stackoverflow.com/questions/16418689/how-is -true-interpreted-when-used-as-matrix-index) –

risposta

13

La risposta a questa domanda ha due facce:

Come viene interpretato NA per l'indicizzazione matrici?

In one of the links fornito da @alexis_laz, ho trovato una spiegazione molto ben strutturata di come TRUE, FALSE e NA vengono interpretati durante l'indicizzazione matrici:

Logical indici indicano R quali elementi da includere o escludere.

Sono disponibili tre opzioni: TRUE, FALSE e NA

Servono a indicare se l'indice rappresentato in quella posizione dovrebbe essere inclusa. In altre parole:

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 

Ad esempio:

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

Un dettaglio importante è che la modalità di memorizzazione predefinito per un valore NA isolata è logico (provate typeof(NA)). È possibile scegliere la modalità di archiviazione di NA utilizzando NA_integer_, NA_real_ (per doppio), NA_complex_ o NA_character_.

Perché 5 NA e non solo 1?

Quando la lunghezza degli indici è minore della lunghezza del vettore x, l'indicizzazione inizierà verso anche indice i valori in x che non sono stati ancora indicizzati. In altre parole, R "ricicla" automaticamente gli indici:

(...) Tuttavia, si applicano le regole di riciclaggio standard. Così, nell'esempio precedente, se togliamo l'ultimo FALSE, il vettore indice viene riciclato, il primo elemento dell'indice è TRUE, e quindi l'elemento 6 x è ora incluso

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

richiamo dettaglio sulla modalità di archiviazione dalla sezione precedente. Se digiti x[NA_integer_], troverai un risultato diverso.

+3

Quali nuove informazioni aggiunge alla risposta nel secondo link fornite da alexis_laz? – Jaap

+4

Non aggiunge alcuna informazione. La domanda era in attesa di una risposta e ho messo insieme le informazioni fornite nei commenti –