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

Join two list in R by id

我有这样的东西:

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 的每个元素的长度可以变化,但 ids 和 ls 的长度是相同的。 Dplyr 和 purrr(tidyverse) 对我来说没问题

最佳

像这样?

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 即可。

最简单的基本 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.

的向量

这里有一个选项base R

setNames(stack(setNames(ls, LETTERS[1:3]))[2:1], c("ids", "ls"))
#   ids  ls
#1   A  aa
#2   A aaa
#3   B  bb
#4   B bbb
#5   C  cc
#6   C ccc