Добавление символов столбца на основе имени файла в R

У меня есть несколько сотен файлов с информацией в файлах .pet, упорядоченных по коду даты (19960101 — это формат ГГГГММДД). Я пытаюсь добавить столбец NDate с кодом даты:

for (pet.atual in files.pet) {
  data.pet.atual <-
    read.table(file = pet.atual,
               header = FALSE,
               sep = ",",
               quote = "\"",           
               comment.char = ";");     
    data.pet.atual <- cbind(data.pet.atual, NDate= pet.atual)
}

То, что я пытаюсь достичь, например, для 01-01-1996 NDate = 19960101, для 01-01-1996 NDate = 19960102 и так далее. Тем не менее, цикл for просто заменяет поле NDate каждый раз, когда он запускается, с последними идеями pet.atual? Спасибо


r csv
person stasisOo    schedule 15.03.2017    source источник
comment
Вероятно, вам следует использовать lapply вместо цикла for с растущим набором столбцов.   -  person Frank    schedule 15.03.2017
comment
При каждом проходе цикла for перезаписывается не только полеNDate, но и поле data.pet.atual.   -  person Uwe    schedule 16.03.2017


Ответы (3)


Небольшая модификация должна помочь:

data.pet.atual <- NULL
for (pet.atual in files.pet) {
    tmp.data <-
    read.table(file = pet.atual,
               header = FALSE,
               sep = ",",
               quote = "\"",           
               comment.char = ";");     
    tmp.data <- cbind(tmp.data, NDate= pet.atual)
    data.pet.atual <- rbind(data.pet.atual, tmp.data)
}

Вы также можете заменить tmp.data<-cbind(...) на tmp.data$NDate <- pet.atual

person Adi Sarid    schedule 15.03.2017

Вы также можете попробовать fread() и rbindlist() из пакета data.table (не проверено из-за отсутствия воспроизводимого примера):

library(data.table)
result <- rbindlist(lapply(files.pet, fread), idcol = "NDate")
result[, NDate := anytime::anydate(files.pet[NDate])]

lapply() "зацикливается" на всех записях в files.pet, выполняя fread() для каждой записи и возвращает список с таблицами data.tables, которые fread создал при чтении каждого файла. rbindlist() используется для объединения всех частей в одну большую таблицу данных. Параметр idcol = NDate создает столбец индекса с именем NDate для определения происхождения каждой строки в конечном выводе. Идентификаторы представляют собой целые числа от 1 до длины списка (если список не имеет имени).

Наконец, номер идентификатора используется для поиска имени файла в files.pet, который напрямую преобразуется в класс Date с помощью пакета anytime.
EDIT Возможно, было бы более эффективно преобразовать имена файлов в Date прежде чем искать их:

result[, NDate := anytime::anydate(files.pet)[NDate]]

Хотя fread() довольно умен в анализе и угадывании правильных параметров для чтения файлов, может быть необходимо (и, возможно, быстрее) указать дополнительные параметры, например:

result <- rbindlist(lapply(files.pet, fread, header = FALSE, sep = ","), idcol = "NDate")
person Uwe    schedule 15.03.2017

Да, lapply поможет, как предполагает Фрэнк. И вы хотите использовать rbind, чтобы даты различались для каждого файла. Что-то вроде:

Я предполагаю, что files.pet - это список всех файлов, которые вы хотите включить...

my.fun<-function(file){
data <- read.table(file = file,
           header = FALSE,
           sep = ",",
           quote = "\"",           
           comment.char = ";")     
data$NDate = file
return(data)}

data.pet.atual <- do.call(rbind.data.frame, lapply(files.pet, FUN=my.fun))

Я не могу проверить это без воспроизводимого примера, поэтому вам, возможно, придется немного поиграть с этим, но общий подход должен работать!

person MPhD    schedule 15.03.2017