2015-06-30 16 views
12

Ho un semplice file CSV denominato "test.csv" con il seguente contenuto:come saltare la lettura alcune colonne in readr

colA,colB,colC 
1,"x",12 
2,"y",34 
3,"z",56 

Diciamo che voglio saltare la lettura di Cola e appena letto in colB e colC. Voglio un modo generale di farlo perché ho molti file da leggere e talvolta colA è chiamato qualcos'altro, ma colB e colC sono sempre gli stessi.

Secondo la documentazione read_csv, un modo per raggiungere questo obiettivo è quello di passare un elenco chiamato per col_types e nominare solo le colonne che si desidera conservare:

read_csv('test.csv', col_types = list(colB = col_character(), colC = col_numeric())) 

da non menzionare la cola dovrebbe ottenere eliminato dalla produzione. Tuttavia, il frame di dati risultante è:

Source: local data frame [3 x 3] 

     colA colB colC 
    1 1 x 12 
    2 2 y 34 
    3 3 z 56 

sto facendo qualcosa di sbagliato o è la documentazione read_csv non è corretta? Secondo il file della guida:

Se un elenco, deve contenere un "raccoglitore" per ogni colonna. Se si si desidera solo leggere un sottoinsieme delle colonne, è possibile utilizzare un elenco con nome (dove i nomi forniscono i nomi delle colonne). Se una colonna non è menzionata per nome , non sarà inclusa nell'output.

+2

'' fread' di data.table' ha 'drop' e argomenti 'select' per questo scopo, per riferimento – MichaelChirico

+2

@jaap, NON un duplicato. Questa domanda riguarda readr :: read_csv() e l'altra domanda riguarda utils :: read.table(). – Angelo

+0

@ Angelo Sì, lo è. La domanda collegata riguarda la lettura di un numero limitato di colonne. Al momento della stesura di quella domanda, 'readr :: read_csv' non esisteva nemmeno. Nel frattempo è stata aggiunta come risposta (da me) per fornire approcci alternativi a 'read.table' /' read.csv' e può quindi servire come target duplicato. – Jaap

risposta

6

C'è una risposta là fuori, ho solo non ha cercato abbastanza duro: https://github.com/hadley/readr/issues/132

A quanto pare questo è stato un problema di documentazione è stato corretto. Questa funzionalità potrebbe eventualmente essere aggiunta, ma Hadley pensava che fosse più utile essere in grado di aggiornare solo un tipo di colonna e non rilasciare gli altri.

+0

quindi la breve risposta corrente corretta è: NO? – userJT

+0

La risposta è ancora "no" anche dopo readr 1.0 versione. Vedi https://github.com/hadley/readr/issues/194 – vergilcw

1

"Secondo la documentazione read_csv, un modo per raggiungere questo obiettivo è quello di passare un elenco chiamato per col_types e nominare solo le colonne che si desidera conservare"

WRONG: read_csv('test.csv', col_types=list(colB='c', colC='c')) 

No, il documento è fuorviante, è necessario specificare che Cols senza nome vengono eliminati (classe '_' o col_skip()), oppure specificare esplicitamente la loro classe come NULL:

read_csv('test.csv', col_types=list('*'='_', colB='c', colC='c')) 

read_csv('test.csv', col_types=list('colA'='_', colB='c', colC='c')) 
Problemi correlati