Как применить подстановочный знак при чтении нескольких листов из файла .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
.