我有这样的事情:
ids <- c("A","B","C")
ls <- list()
ls[[1]] <- c("aa","aaa")
ls[[2]] <- c("bb","bbb")
ls[[3]] <- c("cc","ccc")
我想获得类似下一个的东西:
data.frame(ids = c("A","A","B","B","C","C"), ls = c("aa","aaa","bb","bbb","cc","ccc"))
你知道怎么做吗? ls的每个元素的长度可以变化,但id和ls的长度是相同的。 Dplyr和purrr(tidyverse)对我来说很好
最佳
答案 0 :(得分:3)
最简单的基础R方法是使用unlist
和rep
,如下所示:
data.frame(ids=rep(ids, lengths(ls)), ls=unlist(ls))
ids ls
1 A aa
2 A aaa
3 B bb
4 B bbb
5 C cc
6 C ccc
rep
以不同的长度重复id,每个列表元素的长度由lengths
计算。然后,嵌套列表将转换为带有unlist
的矢量。
答案 1 :(得分:1)
喜欢这个?
library(tidyr)
gather(data.frame(setNames(ls, ids)), ids, ls)
ids ls
1 A aa
2 A aaa
3 B bb
4 B bbb
5 C cc
6 C ccc
这可以通过以下方式工作:首先,我将名称分配给列表:
named_list <- setNames(ls, ids)
named_list
$A
[1] "aa" "aaa"
$B
[1] "bb" "bbb"
$C
[1] "cc" "ccc"
然后将其转换为数据帧:
test_df <- data.frame(named_list)
test_df
A B C
1 aa bb cc
2 aaa bbb ccc
然后我使用tidyr::gather
或reshape2::melt
gather(test_df)
key value
1 A aa
2 A aaa
3 B bb
4 B bbb
5 C cc
6 C ccc
要提供列名,只需按上述方式添加ids
和ls
。
答案 2 :(得分:1)
以下是num: 2.5
3, 2, 2.5