Это легко сделать с помощью mapply
.Но вы должны установить аргумент SIMPLIFY = FALSE
, по умолчанию - TRUE
, и он возвращает matrix
.
Затем, unlist
результат и split
снова, на этот раз атрибутом names
результирующий список.
ma <- mapply(split, list1, ca, SIMPLIFY = FALSE)
tmp <- unlist(ma, recursive = FALSE)
pattern <- ".*\\.([[:digit:]]+)\\s*$"
replace <- "\\1"
split(tmp, sub(pattern, replace, names(tmp)))
#$`1`
#$`1`$`1`
#[1] "apple" "account"
#
#$`1`$`1`
#[1] "tab" "cable"
#
#
#$`2`
#$`2`$`2`
#[1] "appreciate" "adapt"
#
#$`2`$`2`
#[1] "tatabox"
#
#
#$`3`
#$`3`$`3`
#[1] "available"
#
#$`3`$`3`
#[1] "banana"
Наконец, уберите за собой:
rm(tmp)
Объяснение.
mapply
объяснено выше.Попробуйте запустить его без аргумента SIMPLIFY
и посмотрите, каков будет результат.
Затем unlist
.Это связано с тем, что mapply
было применено к списку, результатом split
и ma
является список списков.Если он становится простым списком, все строки всех членов data1
, data2` и т. Д. Находятся на одном уровне списка.
Теперь последний split
.Поскольку вектор names(tmp)
не является вектором отсчетов целевой буквы "a"
, но может быть более сложным, используйте regex , чтобы сохранить только подсчеты.
Это последние цифры после последнего периода "."
и до конца строки имен.
pattern <- ".*\\.([[:digit:]]+)\\s*$"
.
любой символ; .*
любой символ повторяется любое количество раз, ноль или более; \\.
период, экранирован \\
, потому что это специальный символ; (something)
скобка создает группу, в данном случае первую группу; [[:digit:]]
переносимый символьный класс десятичных цифр; [[:digit:]]+
цифры повторяются один или несколько раз; ([[:digit:]]+)
группа состоит как минимум из одной цифры, может быть больше; \\s*
повторяется пробелноль или более раз (возможно, без пробелов вообще); $
конец строки.
При взгляде с конца строки это
([[:digit:]]+)\\s*$
одна или несколько цифр, за которыми могут следовать пробелы непосредственно перед концом строки; \\.([[:digit:]]+)\\s*$
есть точка, \\.
, непосредственно перед шаблоном в точке 1. .*\\.([[:digit:]]+)\\s*$
этому могут предшествовать любые символы, повторяемые любое количество раз.
Замена на \\1
соответствует пареопределено выше.Это означает, что только группа, последние цифры после последнего периода, дойдут до результата.