Как применить подстановочный знак при чтении нескольких листов из файла .xls, используя rio :: import_list в r - PullRequest
1 голос
/ 11 апреля 2020

Я пытался написать код, который будет читать выбранные листы в файле .xls, используя import_list (пакет rio), затем связывать их и конвертировать в файл .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 Ответ

1 голос
/ 11 апреля 2020

Аргумент 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 запись. Но мы должны очистить эти имена, потому что, если мы используем их для имен файлов, Р. будет жаловаться.

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.

...