2015-10-12 12 views
5

Sto tentando di utilizzare rowwise e mutate con una funzione che può restituire un valore NA, ma sto ricevendo un errore. Si consideri questo esempio forzato (che ovviamente non è un caso per rowwise, ma illustra l'errore):dplyr :: rowwise, mutate e errore NA

questo funziona:

library(dplyr) 
data.frame(k=rnorm(10)) %>% mutate(l = ifelse(k > 0, 1, NA)) 

      k l 
1 -1.40223573 NA 
2 1.47581873 1 
3 0.35938746 1 
4 0.87240448 1 
5 -0.61991535 NA 
6 -1.88152820 NA 
7 0.25837350 1 
8 -0.02250385 NA 
9 0.92757943 1 
10 0.49023792 1 

Ma questo dà un errore:

library(dplyr) 
data.frame(k=rnorm(10)) %>% rowwise() %>% mutate(l = ifelse(k > 0, 1, NA)) 

Error: incompatible types, expecting a numeric vector 

risposta

5

Nota: Ho archiviato github issue #1448 per quanto riguarda l'errore nel risultato di questa risposta.

Aggiornamento 29 ottobre 2015: Sembra che questo errore in rowwise() sia stato corretto. Controlla il link sopra per i dettagli.


Prima di tutto, non vi è alcun motivo per rendere questa operazione un'operazione per riga.

Per quanto riguarda l'errore, NA è di tipo logico. Sarà necessario utilizzare NA_real_ nella chiamata a ifelse() in questa operazione per riga. O come nota Ben Bolker nei commenti qui sotto, è possibile avvolgere ifelse() con as.numeric().

data.frame(k = rnorm(10)) %>% 
    rowwise() %>% 
    mutate(l = ifelse(k > 0, 1, NA_real_)) 
# Source: local data frame [10 x 2] 
# Groups: <by row> 
# 
#    k  l 
#   (dbl) (dbl) 
# 1 -1.7105691140 NA 
# 2 -0.0702667985 NA 
# 3 -0.5505724960 NA 
# 4 -0.7444839870 NA 
# 5 -0.0005646999 NA 
# 6 -0.3702584194 NA 
# 7 0.2596026787  1 
# 8 0.4149810662 NA <-- error here pointed out by David A (see comments) 
# 9 -0.4698540654 NA 
# 10 1.0961705022  1 

Nota che si potrebbe anche usare numeri interi, come in

mutate(l = ifelse(k > 0, 1L, NA_integer_)) 

Ma non si può mescolare Logicals e reali/interi in ops fila-saggio sembra.

+0

più clunkily, 'as.numeric (ifelse (...))' funzionerà anche –

+0

@BenBolker Dal momento che è rowwise, 'mutate (l = if (k> 0) 1 else NA_real_)' funziona anche. Probabilmente, dovrebbe * non * essere in fila, però. – Frank

+0

Grazie, quindi immagino ci sia qualche filosofia alla base di questo (di fila, probabilmente?) Che ha a che fare con il non trasmettere valori quando li metti in un vettore? – blindjesse

Problemi correlati