Поэлементная комбинация двух списков в R
Скажем, у меня есть два списка:
list.a <- as.list(c("a", "b", "c"))
list.b <- as.list(c("d", "e", "f"))
Я хотел бы объединить эти списки рекурсивно, чтобы в результате получился список объединенных элементов в виде вектора, подобного следующему:
[[1]]
[1] a d
[[2]]
[1] a e
[[3]]
[1] a f
[[4]]
[1] b d
и так далее. Я чувствую, что здесь упускаю что-то относительно простое. Любая помощь?
Приветствия.
6 ответов
expand.grid(list.1, list.b)
дает желаемый результат в data.frame
состав. Как правило, это наиболее полезный формат для работы с данными в R. Однако вы можете получить точную структуру, которую вы запрашиваете (сохранить порядок), вызвав apply
а также lapply
:
result.df <- expand.grid(list.a, list.b)
result.list <- lapply(apply(result.df, 1, identity), unlist)
Если вы хотите, чтобы этот список был упорядочен по первому элементу:
result.list <- result.list[order(sapply(result.list, head, 1))]
Ты хочешь mapply
(если под "рекурсивно" вы подразумеваете "параллельно"):
mapply(c, list.a, list.b, SIMPLIFY=FALSE)
Или, может быть, это больше, чем вы хотите:
unlist(lapply(list.a, function(a) lapply(list.b, function (b) c(a, b))), recursive=FALSE)
Удивлен никто не упомянул этот простой вкладыш:
as.list(outer(list.a,list.b, paste))
[[1]]
[1] "a d"
[[2]]
[1] "b d"
[[3]]
[1] "c d"
[[4]]
[1] "a e"
Это дает вам то, что вы ищете:
unlist(lapply(list.a, function(X) {
lapply(list.b, function(Y) {
c(X, Y)
})
}), recursive=FALSE)
Вот функция, которую вы можете передавать списки, чтобы расширить
expand.list <- function(...){
lapply(as.data.frame(t((expand.grid(...)))),c, recursive = TRUE, use.names = FALSE)}
expand.list(list.a, list.b)
Вот несколько грубый метод, который, учитывая, что они имеют одинаковые размеры, присоединяет list.b к list.a с помощью функции append.
# CREATE LIST OBJECTS
list.a <- as.list(c("a", "b", "c"))
list.b <- as.list(c("d", "e", "f"))
# CREATE AN EMPTY LIST TO POPULATE
list.ab <- list()
# DOUBLE LOOP TO CREATE RECURSIVE COMBINATIONS USING append
ct=0
for( i in 1:length(list.a) ) {
for (j in 1:length(list.b) ) {
ct=ct+1
list.ab[[ct]] <- append(list.a[[i]], list.b[[j]])
}
}
# PRINT RESULTS
list.ab