如何在数据框内创建列表

时间:2018-09-25 10:19:16

标签: r list dataframe

我想在一个数据框中包含三列,每行包含一个列表,每一行包含一个列表

输入

mylist1 <- strsplit(c("banana","tomato","NA"), ",")
mylist2 <- strsplit(c("orange","nut","tomato"), ",")
mylist3 <- strsplit(c("orange","nut","NA"), ",")

所需的输出

mylist1   mylist2   mylist3
list       list       list

但是现在我得到一个将列表分成不同列的数据框。如何在数据框内创建列表列表?

当前输出

structure(list(X.banana. = "banana", X.tomato. = "tomato", X.NA. = "NA", 
               X.orange. = "orange", X.nut. = "nut", X.tomato..1 = "tomato", 
               X.orange..1 = "orange", X.nut..1 = "nut", X.NA..1 = "NA"), class = "data.frame", row.names = c(NA, 
                                                                                                              -1L))

2 个答案:

答案 0 :(得分:0)

这是一种方法:

df <- data.frame(row.names=1)
df$l1 <- list(mylist1)
df$l2 <- list(mylist2)
df$l3 <- list(mylist3)

> dim(df)
[1] 1 3
> df
                  l1                  l2              l3
1 banana, tomato, NA orange, nut, tomato orange, nut, NA

另一种对程序更友好的方法是首先将它们放在矩阵中:

df <- as.data.frame(matrix(list(mylist1, mylist2, mylist3), nrow=1))

> df
                  V1                  V2              V3
1 banana, tomato, NA orange, nut, tomato orange, nut, NA

答案 1 :(得分:0)

这是另一种方式。首先,我们将所有内容放入列表中,然后映射一个数据框。最后,我们将数据散布到整个范围。

library(tidyverse)

df <- list(mylist1, mylist2, mylist3) %>% 
  map_df(., ~tribble(~col, .x)) %>%
  mutate(name = c("mylist1", "mylist2", "mylist3")) %>% 
  spread(name, col)
df
#> # A tibble: 1 x 3
#>   mylist1    mylist2    mylist3   
#>   <list>     <list>     <list>    
#> 1 <list [3]> <list [3]> <list [3]>

每一列都包含一个列表:

df$mylist1
#> [[1]]
#> [[1]][[1]]
#> [1] "banana"
#> 
#> [[1]][[2]]
#> [1] "tomato"
#> 
#> [[1]][[3]]
#> [1] "NA"