C'è un modo per fread
per simulare il comportamento del read.table
cui il class
della variabile viene impostato dai dati che viene letta in.Prevenire colonna classe inferenza in fread()
Ho dati numerici con pochi commenti sotto i dati principali. Quando uso fread
per leggere nei dati, le colonne vengono convertite in caratteri. Tuttavia, impostando nrow
in read.table` posso fermare questo comportamento. È possibile in frotte. (Preferirei non modificare i dati grezzi o fare una copia modificata). Grazie
Un esempio
d <- data.frame(x=c(1:100, NA, NA, "fff"), y=c(1:100, NA,NA,NA))
write.csv(d, "test.csv", row.names=F)
in_d <- read.csv("test.csv", nrow=100, header=T)
in_dt <- data.table::fread("test.csv", nrow=100)
che produce
> str(in_d)
'data.frame': 100 obs. of 2 variables:
$ x: int 1 2 3 4 5 6 7 8 9 10 ...
$ y: int 1 2 3 4 5 6 7 8 9 10 ...
> str(in_dt)
Classes ‘data.table’ and 'data.frame': 100 obs. of 2 variables:
$ x: chr "1" "2" "3" "4" ...
$ y: int 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, ".internal.selfref")=<externalptr>
Come soluzione alternativa ho pensato di essere in grado di utilizzare read.table
per leggere in una sola riga, ottenere la classe e impostare il colClasses
, ma sto fraintendendo.
cl <- read.csv("test.csv", nrow=1, header=T)
cols <- unname(sapply(cl, class))
in_dt <- data.table::fread("test.csv", nrow=100, colClasses=cols)
str(in_dt)
Utilizzando Windows8.1 versione R 3.1.2 (2014/10/31) Piattaforma: x86_64-W64-mingw32/x64 (64-bit)
Sembrava un piano ragionevole, ma in realtà ho letto la pagina di aiuto: "fread promuoverà una colonna solo a un tipo più alto se colClasses lo richiede. Non effettuerà il downgrade di una colonna a un tipo inferiore dal risultato di NA. costretti a forzare tali colonne in seguito, se hai davvero bisogno di una perdita di dati. " Sembra che anche la limitazione della lettura a 5 righe fallisca. Penso di ricordare che il meccanismo di colClasses era un'aggiunta abbastanza recente, quindi forse dovresti inviare una richiesta di funzionalità. Matthew e Arun sono spesso molto accomodanti. –
Sicuramente ci deve essere una strategia DT per forzare tutte le colonne a numeriche? Imposta '.SDcols' su un vettore appropriato e qualcosa del genere:' DT [, .SD: = lapply (.SDcols, as.numeric), .SDcols = vec] '. Non sono un utente di DT, ma sono sicuro che ci sia un approccio di tipo minimale e sospetto che tu possa trovarlo illustrato nelle risposte SO. –
@BondedDust; Anche io non sono un utente DT, solo che read.table sta avendo (più gravi) problemi con i miei dati di quanto lo sia. Devo dare un'occhiata a SO. grazie – user2957945