2015-06-11 9 views
9

Ricordo un commento su r-help nel 2001 che diceva che drop = TRUE in [.data.frame era la peggiore decisione di progettazione nella cronologia R.Best practice per ottenere una colonna rilasciata in dplyr tbl_df

dplyr corregge questo e non si abbassa implicitamente. Quando si tenta di convertire il vecchio codice in stile dplyr, questo introduce alcuni bug sgradevoli quando si assume che d[, 1] o d[1] sia un vettore.

La mia soluzione corrente utilizza unlist come illustrato di seguito per ottenere un vettore a 1 colonna. Qualche idea migliore?

library(dplyr) 

d2 = data.frame(x = 1:5, y = (1:5)^2) 
str(d2[,1]) # implicit drop = TRUE 
# int [1:5] 1 2 3 4 5 

str(d2[,1, drop = FALSE]) 
# data.frame': 5 obs. of 1 variable: 
# $ x: int 1 2 3 4 5 

# With dplyr functions 
d1 = data_frame(x = 1:5, y = x^2) 
str(d1[,1]) 
# Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable: 
# $ x: int 1 2 3 4 5 

str(unlist(d1[,1])) 
# This ugly construct gives the same as str(d2[,1]) 
str(d1[,1][[1]]) 
+2

perché non basta usare 'd1 [[1]]' – shadow

+0

Funziona anche. Mi sono perso in [[]] spazio. Si prega di inviare come risposta come riferimento. Ho pubblicato questo riepilogo perché non sono riuscito a trovarlo su SO e nei documenti. Se qualcuno ha trovato un avvertimento nei documenti 'dplyr', per favore aggiungi il link qui. –

risposta

7

si può semplicemente utilizzare la funzione [[ estratto invece di [.

d1[[1]] 
## [1] 1 2 3 4 5 

Se si utilizza un sacco di tubazioni con dplyr, si consiglia inoltre di utilizzare le funzioni comfort extract e extract2 dal pacchetto magrittr:

d1 %>% magrittr::extract(1) %>% str 
## Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable: 
## $ x: int 1 2 3 4 5 
d1 %>% magrittr::extract2(1) %>% str 
## int [1:5] 1 2 3 4 5 

O se extract è troppo prolisso per voi, si può semplicemente utilizzare [ direttamente nel tubo:

d1 %>% `[`(1) %>% str 
## Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable: 
## $ x: int 1 2 3 4 5 
d1 %>% `[[`(1) %>% str 
## int [1:5] 1 2 3 4 5 
+0

'magrittr :: extract (1)' è stato menzionato in un'altra discussione SO. È un po 'prolisso e non molto comodo quando hai bisogno di più colonne. –

+0

'[[' (1): bella dimostrazione, ma una delle ragioni per cui molte persone pensano che R sia secondo a Perl come un linguaggio di sola scrittura. –

+0

Da dove provengono '\' [\ '(1)' e '\' [[\ '(1)', dove posso trovare qualche documentazione su questo? E perché dovrei inserire un vettore con un nome tra virgolette quando voglio usare extract2, ad esempio 'extract2 (" x ") – dpprdan