Новая переменная из list.file - PullRequest
       7

Новая переменная из list.file

0 голосов
/ 12 октября 2018

Я создаю объект, вызывающий все .csv файлы в каталоге, считываю их в соответствии с некоторыми спецификациями и объединяю их.

Прежде чем объединить их, я хочу взять первые две буквы имен файлов и создать новый столбец в каждой таблице, сообщая об этих двух буквах как переменную.

Я получил это далеко:

temp = list.files(pattern="*.csv")
myfiles = lapply(temp, function(x) read.csv(x,
                                        header=TRUE, 
                                        #sep=";",
                                        stringsAsFactors=F,
                                        encoding = "UTF-8",
                                        na.strings = c("NA",""),
                                        colClasses=c("code"="character")))

myfiles.final = do.call(rbind, myfiles)

Когда я пытаюсь создать новую переменную, хотя я генерирую замену, которая содержит двойные строки данных:

temp.2 <- lapply(temp, function(x) substr(x, start = 1, stop = 2))
myfiles.2 = lapply(myfiles, 
               function(x){
                 a <- temp.2[seq_along(myfiles)]
                 x$identifier <- rep(a,nrow(x))
                 return(x)
                 })

В папке имена файлов, например AA029893.csv, BB024593.csv ..., для первой таблицы я просто хочу новый столбец с именем «identifier», который имеет «AA» для всех записей, для второго «BB» и т. Д.

Спасибомного

1 Ответ

0 голосов
/ 12 октября 2018

lapply подходит для итерации по 1 списку (например, myfiles фреймы данных).Чтобы добавить столбец в каждый фрейм данных, необходимо выполнить итерацию параллельно по двум спискам: списку фреймов данных и списку имен.Map делает это (для произвольного числа списков):

myfiles.2 = Map(function(dd, nn) {dd$identifier = nn; return(dd)},
                dd = myfiles, nn = temp.2)

Более простой альтернативой является добавление столбца post-hoc:

myfiles.final = do.call(rbind, myfiles)
myfiles.final$identifier = rep(
  sapply(temp, function(x) substr(x, start = 1, stop = 2)),
  each = lengths(myfiles)
)

Самой простой альтернативой является использованиеdata.table::rbindlist или dplyr::bind_rows, любой из которых автоматически добавит столбец ID на основе имен вашего списка.В зависимости от размера ваших данных, они также могут быть немного быстрее.

names(myfiles) = sapply(temp, function(x) substr(x, start = 1, stop = 2))
myfiles.2 = dplyr::bind_rows(myfiles)
myfiles.2 = data.table::rbindlist(myfiles, idcol = "identifier")
...