将不同列表的子列表组合到数据帧列表中

时间:2018-04-06 02:39:28

标签: r list dataframe

我有大量的列表,每个列表都包含许多子列表。每个列表都包含一个子列表,其中每个子列表在不同列表中具有相同的名称和观察数量。

以下是一个简单的数据示例:

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  

2 个答案:

答案 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)

使用的解决方案。我们的想法是使用map2遍历两个列表中的每个元素,使用map_dfras_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