通过id加入R中的两个列表

时间:2017-08-30 11:20:53

标签: r dplyr tidyverse

我有这样的事情:

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)对我来说很好

最佳

3 个答案:

答案 0 :(得分:3)

最简单的基础R方法是使用unlistrep,如下所示:

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::gatherreshape2::melt

对其进行整形
gather(test_df)
  key value
1   A    aa
2   A   aaa
3   B    bb
4   B   bbb
5   C    cc
6   C   ccc

要提供列名,只需按上述方式添加idsls

答案 2 :(得分:1)

以下是num: 2.5

的一个选项
3, 2, 2.5