Используя регулярные выражения, вы можете идентифицировать уникальные датчики 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))