2017-02-08 1 views
2

У меня есть несколько файлов excel, и у них есть уникальные имена листов (дата создания файла в моем случае). Я прочитал их навалом и должен присвоить имя листа каждому файлу в новом столбце «id». Я знаю, как сделать числовой идентификатор, или id = имя файла, но не могу найти способ получить имя листа как id.R: чтение нескольких файлов excel, извлечение первых имен листов и создание нового столбца

library(readxl) 
library(data.table) 

file.list <- list.files("C:/Users/.../Studies/",pattern='*.xlsx') 
df.list <- lapply(file.list, read_excel) 

#id = numeric 
df <- rbindlist(df.list, idcol = "id") 

#Or by file name: 
attr(df.list, "names") <- file.list 
df2 = rbindlist(df.list,idcol="id") 

#How to get sheet names? 
+0

'attr (df.list," names ") <- sapply (file.list, excel_sheets)'? Должен работать, если каждый файл имеет только один лист. – Abdou

+0

Спасибо. К сожалению, количество листов в каждом файле больше одного. Обычно 2, но может быть больше –

+1

Итак, вы работаете только с первым листом из каждого файла? Если нет, то 'df.list' не содержит правильных данных. Если это так, вы можете сделать: 'attr (df.list," names ") <- sapply (file.list, function (x) excel_sheets (x) [1])'. – Abdou

ответ

2

Если вам случится работать только с первыми листами файлов, то следующий должна помочь вам захватить имена первых листов, как id для ваших dataframes:

attr(df.list, "names") <- sapply(file.list, function(x) excel_sheets(x)[1]) 

Однако, если вы планируете импортировать данные из всех доступных листов вам нужно будет сделать немного больше работы, начиная с тем, как создать свой список dataframes:

df.list <- lapply(file.list,function(x) { 
    sheets <- excel_sheets(x) 
    dfs <- lapply(sheets, function(y) { 
    read_excel(x, sheet = y) 
    }) 
    names(dfs) <- sheets 
    dfs 
}) 

Это должно создать список списков, который должен содержать все доступные данные в ваших файлах. Списки в главном списке назначаются соответственно именам листов. Таким образом, вам не придется менять какие-либо атрибуты впоследствии. Но для привязки данных к кадрам вам необходимо:

rbindlist(lapply(df.list, rbindlist, id = "id")) 

Надеюсь, это окажется полезным.

Смежные вопросы