Как применить подстановочный знак при чтении нескольких листов из файла .xls с помощью rio :: import_list в r

Я пытался написать код, который будет читать выбранные листы в файле.xls, используя import_list (пакет rio), а затем rbinding и конвертировать их в файл.csv. До сих пор я мог заставить код читать либо все листы в файле xls одновременно, либо последовательные листы (например, 1:4), но не выбранные листы на основе их имен. Пожалуйста помоги. Я прикрепил текущую версию своего кода и часть своих данных.

library(rio)
d <- import_list("allTP.xls", which = (("201901,Xizhi,PM10")), setclass="data.table",range = "A2:Y33", rbind = T, col_names=T, rbind_label = "_file", rbind_fill = TRUE) 

Пример данных

1 ответ

В whichаргумент должен быть вектором имен листов. То есть он должен быть в этом формате, используяc функция:

which = c("201901,Xizhi,PM10", "201902,Xizhi,PM10", "201902,Wanli,PM10")

или любые другие листы, которые вы хотите импортировать.

В whichаргумент не поддерживает регулярное выражение, поэтому импорт листов с использованием подстановочных знаков невозможен. Но вы можете импортировать все листы, а затем использовать_file столбец для выбора данных для индивидуального экспорта (если вы знаете, какой номер листа есть, поскольку имена листов не сохраняются, только номер).

В ваших данных у вас есть вся информация в первой строке, но вы не импортируете ее, потому что вы указываете диапазон как "A2:Y33". Если вы выберете "A1:Y33", то вы получите "символы" для всех столбцов, а это вам не нужно, поскольку имена столбцов начинаются со строки 2.

Одно из решений - импортировать все листы, range="A2:Y33", как вы, а затем повторить для диапазона "A1:Y2", сохранив результат как d2. Этот диапазон содержит информацию, которую вам нужно выбрать. Затем вы можете объединитьd с d2 на _file и экспортировать отдельные файлы csv на основе информации в d2.

library(rio)

d1 <- import_list("sample_data.xlsx", 
                  setclass="data.table", 
                  range = "A2:Y33", rbind = T, 
                  col_names=T, 
                  rbind_label = "_file", 
                  rbind_fill = TRUE) 

За d2 мы импортируем только диапазон "A1:Y1", затем подмножество столбцов 1, 7, 13 и 26 и устанавливаем имена соответствующим образом.

d2 <- setNames(
  subset(
    import_list("sample_data.xlsx", 
                setclass="data.table", 
                range = "A1:Y1", rbind = T, 
                col_names=F, 
                rbind_label = "_file"), 
    select=c(1,7,13,26)), 
  c("Site","Param","YM","_file"))

Затем объедините два набора данных на _file столбец.

d3 <- merge(d1, d2, by="_file")

Проверить данные.

table(d3$Site, d3$Param, d3$YM)
, ,  = YM: 2019/01                     
                     Param: AMB_TEMP(℃) Param: PM10(μg/m3)
  Site: Wanli                        31                 31
  Site: Xizhi                        31                 31

, ,  = YM: 2019/02                     
                     Param: AMB_TEMP(℃) Param: PM10(μg/m3)
  Site: Wanli                        31                 31
  Site: Xizhi                        31                 31

Итак, есть восемь листов, каждый из которых содержит 31 запись. Но мы должны очистить эти имена, потому что, если мы используем их для имен файлов, R будет жаловаться.

d3$Site <- sub(".*: (.+)", "\\1", d3$Site)
d3$Param <- sub(".*: (.+)\\(.+", "\\1", d3$Param)
d3$YM <- sub(".*: (\\d{4})\\/(.+)", "\\1_\\2", d3$YM)

Теперь разделите на взаимодействие всех трех контекстных переменных.

f <- with(d3, split(d3, list(Site, Param, YM)))

И сохраните в отдельные файлы CSV.

lapply(names(f), function(x) write.csv(f[[x]], file=paste(x, ".csv", sep="")))

dir()
[1] "Wanli.AMB_TEMP.2019_01.csv" "Wanli.AMB_TEMP.2019_02.csv" "Wanli.PM10.2019_01.csv"    
[4] "Wanli.PM10.2019_02.csv"     "Xizhi.AMB_TEMP.2019_01.csv" "Xizhi.AMB_TEMP.2019_02.csv"
[7] "Xizhi.PM10.2019_01.csv"     "Xizhi.PM10.2019_02.csv"

Затем вы можете легко выбрать экспорт только тех данных, которые вам нужны, используя подмножество f или d3.

Другие вопросы по тегам