我有大量的列表,每个列表都包含许多子列表。每个列表都包含一个子列表,其中每个子列表在不同列表中具有相同的名称和观察数量。
以下是一个简单的数据示例:
score <- list(Bob = list(c('1'), ('0')), Jane = list(c('1'), ('2'), ('4'), ('2')))
comments <- list(Bob = list(c('AAA'), ('BBB')), Jane = list(c('ZZZ'), ('XXX'), ('YYY'), ('QQQ')))
我希望创建一个数据框列表,将子列表组合在一起并保留名称。
my.list.Bob
score comments
1 AAA
0 BBB
my.list.Jane
score comments
1 ZZZ
2 XXX
4 YYY
2 QQQ
答案 0 :(得分:3)
这是给你的一种方式。如果您在全局环境中拥有所有列表,则可以执行以下操作。首先,创建一个包含所有列表的列表。然后,您使用transpose()
允许您为每个人创建一个列表(例如,Bob的评分和评论列表)。在每个列表中,在这种情况下,您有评论和得分作为嵌套列表。您想要在每个列表中取消列表。因此,您可以使用rawr rapply2()
。最后,为每个列表创建一个数据框。
library(magrittr)
library(purrr)
library(rawr) #devtools::install_github('raredd/rawr')
score <- list(Bob = list(c('1'), ('0')), Jane = list(c('1'), ('2'), ('4'), ('2')))
comments <- list(Bob = list(c('AAA'), ('BBB')), Jane = list(c('ZZZ'), ('XXX'), ('YYY'), ('QQQ')))
# Get all objects in the global environment and create a list.
mylist <- mget(ls(pattern = ".*"))
purrr::transpose(mylist) %>%
rapply2(unlist, classes = "list") %>%
lapply(as.data.frame, stringsAsFactors = FALSE)
$Bob
comments score
1 AAA 1
2 BBB 0
$Jane
comments score
1 ZZZ 1
2 XXX 2
3 YYY 4
4 QQQ 2
答案 1 :(得分:2)
使用tidyverse的解决方案。我们的想法是使用map2
遍历两个列表中的每个元素,使用map_dfr
和as_data_frame
创建数据框,然后使用bind_cols
组合每个数据框。 / p>
library(tidyverse)
map2(score, comments, function(x, y){
X <- map_dfr(x, as_data_frame)
Y <- map_dfr(y, as_data_frame)
dat <- bind_cols(X, Y) %>%
set_names(c("score", "comments"))
})
# $Bob
# # A tibble: 2 x 2
# score comments
# <chr> <chr>
# 1 1 AAA
# 2 0 BBB
#
# $Jane
# # A tibble: 4 x 2
# score comments
# <chr> <chr>
# 1 1 ZZZ
# 2 2 XXX
# 3 4 YYY
# 4 2 QQQ