我想在一个数据框中包含三列,每行包含一个列表,每一行包含一个列表
输入
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))
答案 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"