Как отфильтровать список векторов символов в R? - PullRequest
0 голосов
/ 17 ноября 2018

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

Я собираюсь собрать несколько наборов данных из тысяч файлов Excel в компании SharePoint. Мне удалось успешно очистить с помощью readxl.

library(readxl)
library(data.table)
library(XLConnect)

root_URL <- '//companyname.office.abc.com/sites/thesite/thefolder')
folder.list <- list.dirs(root_URL)
file.list <- list.files(folder.list, pattern = "*.(xlsx|XLSX|xls|XLS|xlsm|XLSM|xlsb|XLSB)$",full.names = T,include.dirs = T)

Что приводит к хорошему списку всех файлов, которые я потенциально должен почистить. Я успешно извлек необходимые данные из определенной вкладки («Адрес») из 3-го, 4-го и 5-го файлов в моем списке, используя следующий код.

ex.list <- file.list[3:5]
ex.list <- setNames(ex.list, ex.list)

df.list <- lapply(ex.list, read_excel, sheet = 'Address' )

df.list <- Map(function(df, name) {
  df$source_name <- name
  df
}, df.list, names(df.list))
df <- rbindlist(df.list, idcol = "id")
write.csv(df,"testdata1.csv")

Проблема, с которой я столкнулся, заключается в том, что 1-й, 2-й (и другие файлы) не имеют вкладки под названием «Адрес», и мне нужно исключить эти файлы из моего file.list, но, поскольку это список векторов символов, я пытаюсь отфильтровать список, чтобы исключить, когда файл не содержит вкладку под названием «Адрес»

Я использовал lappy со следующим результатом и даже пробовал sapply (также поделился), но сейчас пытаюсь написать условное выражение. Чувствую себя очень близко, но очень далеко.

> aa <- lapply(ex.list, excel_sheets)
> aa
[[1]]
[1] "NODE SIDE A" "NODE SIDE B" "LMA"         "BASE"        "TUBE"        "Notes"      

[[2]]
[1] "NODE SIDE A" "LMA"         "BASE"        "TUBE"        "Notes"      

[[3]]
[1] "Equipment-Details" "Address"           "Drop Down Values"  "Validation Status" "EquipMaster"      

[[4]]
[1] "Equipment-Details" "Address"           "Drop Down Values"  "Validation Status" "EquipMaster"      

[[5]]
[1] "Equipment-Details" "Address"           "Drop Down Values"  "Validation Status" "EquipMaster"  

> bb <- sapply(ex.list, excel_sheets)
> bb
$'//companyname.office.abc.com/sites/thesite/thefolder/subfolder/file1.xls`
[1] "NODE SIDE A" "NODE SIDE B" "LMA"         "BASE"        "TUBE"        "Notes"      

$`//companyname.office.abc.com/sites/thesite/thefolder/subfolder/file2.xls`
[1] "NODE SIDE A" "LMA"         "BASE"        "TUBE"        "Notes"      

$`//companyname.office.abc.com/sites/thesite/thefolder/subfolder/file3.xls`
[1] "Equipment-Details" "Address"           "Drop Down Values"  "Validation Status" "EquipMaster"      

$`//companyname.office.abc.com/sites/thesite/thefolder/subfolder/file4.xls`
[1] "Equipment-Details" "Address"           "Drop Down Values"  "Validation Status" "EquipMaster"      

$`//companyname.office.abc.com/sites/thesite/thefolder/subfolder/file5.xls`
[1] "Equipment-Details" "Address"           "Drop Down Values"  "Validation Status" "EquipMaster"  

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Чтение во всех файлах вы можете отфильтровать список, используя

aa <- list(c("A", "B", "C"),
           c("A", "B", "Address"),
           c("A", "B", "Address"),
           c("A", "B", "C"))

aa[grep(pattern = "Address", aa)]
0 голосов
/ 17 ноября 2018

Я думаю, что это должно работать:

library(readxl)
df.list <- lapply(ex.list, function(x) 
  if ("Address" %in% excel_sheets(x)) read_excel(x,sheet = 'Address')
  else NULL)
...