Объединить два списка в фрейме данных в R

у меня есть два списка с различной структурой:

listA <- list(c("a","b","c"), c("d","e"))
listB <- list(0.05, 0.5)

listA
[[1]]
[1] "a" "b" "c"

[[2]]
[1] "d" "e"

listB
[[1]]
[1] 0.05

[[2]]
[1] 0.5

у меня есть идея, как использовать цикл для объединения обоих списков в фрейме данных, который выглядит как ниже, но я уверен, что есть более эффективный способ сделать это.

data.frame(A = c("a","b","c","d","e"), B = c(rep(0.05,3), rep(0.5,2)))
  A    B
1 a 0.05
2 b 0.05
3 c 0.05
4 d 0.50
5 e 0.50

4 ответов


еще один вариант:

do.call(rbind, Map(data.frame, A=listA, B=listB))

#   A    B
# 1 a 0.05
# 2 b 0.05
# 3 c 0.05
# 4 d 0.50
# 5 e 0.50

может быть есть более элегантный способ, который держит класс numeric of list2'S элементов... Но этот тоже работает!--6-->

df <- do.call(rbind,mapply(cbind, listA, listB))
df <- as.data.frame(df, stringsAsFactors = FALSE)
df[,2] <- as.numeric(df[,2])

редактировать лучше-это решение Матфея Плаурд с помощью Map ака mapply(data.frame, A=listA, B=listB, SIMPLIFY = FALSE)


Я бы предпочел этот:

do.call(rbind,
        Map(function(...) setNames(cbind.data.frame(...), 
                                   c("A", "B")), 
            listA, listB))
#  A    B
#1 a 0.05
#2 b 0.05
#3 c 0.05
#4 d 0.50
#5 e 0.50

вот еще один способ:

do.call(rbind,
        lapply(1:length(listA),
               function(i)
                 data.frame(A=unlist(listA[i]),
                            B=unlist(listB[i]))))