2014-11-12 12 views
12

Ho un problema semplice, ma non ho potuto cogliere la logica per superarlo.NA non sono consentiti nelle assegnazioni con subscript

Ho i vettori numerici con NA e voglio applicare un'operazione dipendente da condizione.

Un semplice esempio simile al mio problema è:

x <- c(1,3,5,7,NA,2,4,6) 
x[x>=5] <- c(1:8)[x>=5] 
x[x<5] <- (c(1:8)*10)[x<5] 

restituisce l'errore "AN non sono ammessi nelle assegnazioni indicizzate", quindi mi piacerebbe sapere che cosa sarebbe una soluzione ragionevole per questo, dato che eseguire ogni attribuzione funziona separatamente come previsto.

desidero avere il risultato atteso:

[1] 10 20 3 4 NA 60 70 8 

Preferibilmente senza dover effettuare un ciclo, in quanto questa operazione è già in funzione per la modellazione nullo con un sacco di iterazioni che sta prendendo età.

Grazie in anticipo, Leonardo

+2

Questo è molto interessante. Sembra che non sia possibile combinare numeri interi con 'NA' mentre sottotitoli e assegnando solo se si ha più di un valore su RHS ... I.e. 'x [c (NA, 1)] <- 100' e ' x [NA] <- 100' funzioneranno entrambi, mentre 'x [c (NA, 1)] <- 100: 101' o ' x [NA] <- 100: 101' non sarà –

+2

Questa è una domanda preziosa in quanto arriva a quel messaggio di errore. Ma è importante notare che anche se il tuo codice funziona senza errori causati da NA, non produrrebbe quel risultato atteso. La riga 2 del tuo codice sovrascriverebbe i valori originali di 5 e 7 utilizzati per prevedere il risultato 3 e 4 sopra (anziché 30 e 40) e sarebbero 3 e 4 per la linea temporale 3, causando per diventare 30 e 40. Prova: 'x [x> = 5 &! is.na (x)] <- c(1:8)[x> = 5 &! is.na (x)]; x [x <5 &! Is.na (x)] <- (c (1: 8) * 10) [x <5 &! Is.na (x)] ' –

risposta

8

La logica dovrà anche escludere le AN nel sottoinsieme. Vedi il seguente esempio. Notare che i vettori dei sottoinsiemi vengono memorizzati prima che venga modificato x.

x <- c(1,3,5,7,NA,2,4,6) 
subset1 <- x>=5 & !is.na(x) 
subset2 <- x<5 & !is.na(x) 

x[subset1] <- which(subset1) 
x[subset2] <- 10*which(subset2) 
0

Penso che si sta mescolanza assegnazione e subscripting. Credo che quello che stai cercando sia qualcosa di più vicino a questo:

x <- c(1,3,5,7,NA,2,4,6) 
x.greater <- c(1:8)[x>=5] 
x.less <- (c(1:8)*10)[x<5] 

x.greater 
# 3 4 NA 8 
x.less 
# 10 20 NA 60 70 

result <- c(x.greater, x.less) 
result 
# 3 4 NA 8 10 20 NA 60 70 
Problemi correlati