Подмножество данных в большом списке, основанное на имени файла данных в списке - PullRequest
0 голосов
/ 30 марта 2020

Я работаю с большим списком, который содержит 450 фреймов данных. Я приведу пример имен фреймов данных :

ALL_SM51_SE1_hourly, ALL_SM201_SE1_hourly, ALL_SM501_SE1_hourly
ALL_SM51_SE2_hourly, ALL_SM201_SE2_hourly, ALL_SM501_SE2_hourly
...................................................................
ALL_SM51_SE150_hourly, ALL_SM201_SE150_hourly, ALL_SM501_SE150_hourly

Фреймы данных содержат данные об измеренной влажности почвы на разных глубинах (5 см, 20 см, 50 см, , представленные «SM51, SM201, SM501» в именах файлов ), и есть 150 датчиков (, представленных как «SE1, SE2, SE3, ...» в имени файла ) вот почему у меня есть 450 фреймов данных, которые хранятся в списке.

Что я хотел бы сделать: я хочу создать новый список (сделать подмножество) для каждого датчика, который затем содержит 3 элемента. Поэтому я хочу иметь список для SE1, SE2, SE3, ..., SE150 с соответствующими глубинами измерения.

Я уже искал подходящий ответ на свой вопрос, но я нашел ответы, которые подмножество данных, указав c значения, но Я хочу подмножество имен файлов .

Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 30 марта 2020

Используя регулярные выражения, вы можете идентифицировать уникальные датчики un.se, которые вы можете paste до new.names. Исходный список lst может быть split в уникальные датчики, ordered и преобразован в data.frame s.

un.se <- gsub(".*SE(\\d+).*", "\\1", names(lst))
new.names <- paste0("SE", unique(un.se))
tmp <- setNames(split(lst, un.se), paste0("SE", unique(un.se)))
res <- lapply(tmp, function(x) {
  nm <- gsub(".*SM(\\d+).*", "\\1", names(x))
  setNames(lapply(x[order(nm)], data.frame), paste0("d", gsub("1$", "", nm)))
  })

Пояснение gsub -regex:

В регулярном выражении .* ищет любой «символ-до», тогда мы буквально получаем SE. Теперь мы используем группировку внутри скобок ( ), где с помощью \\d+ ищем одно или несколько вхождений числа или d i git. Во втором gsub -аргументе \\1 выполняется обратная ссылка на первую группу (в скобках) для замены всей строки. Например, в результате un.se - это число после каждой SE в каждой строке (см .: https://regex101.com/r/zuO8Ts/1; и обратите внимание, что нам нужно двойное экранирование \\ в R).

Здесь перечислены все датчики с кадрами данных для каждой глубины в подсписках.

Результат

res
# $SE1
# $SE1$d5
#   x1 x2 x3
# 1  1  2  3
# 
# $SE1$d20
#   x1 x2 x3
# 1  1  2  3
# 
# $SE1$d50
#   x1 x2 x3
# 1  1  2  3
# 
# 
# $SE2
# $SE2$d5
#   x1 x2 x3
# 1  1  2  3
# 
# $SE2$d20
#   x1 x2 x3
# 1  1  2  3
# 
# $SE2$d50
#   x1 x2 x3
# 1  1  2  3

Данные игрушки

lst <- list(ALL_SM51_SE1_hourly = list(x1 = 1, x2 = 2, x3 = 3), ALL_SM201_SE1_hourly = list(
    x1 = 1, x2 = 2, x3 = 3), ALL_SM501_SE1_hourly = list(x1 = 1, 
    x2 = 2, x3 = 3), ALL_SM51_SE2_hourly = list(x1 = 1, x2 = 2, 
    x3 = 3), ALL_SM201_SE2_hourly = list(x1 = 1, x2 = 2, x3 = 3), 
    ALL_SM501_SE2_hourly = list(x1 = 1, x2 = 2, x3 = 3))
...