根据名称的部分匹配合并列表中数据框的元素

Merge elements of dataframe in list based on partial match of names

我有一个列表:

lst <- list(a1=dfa1, a2=dfa2, b1=dfb1, b2=dfb2)

dfa1 <- data.frame(x=c(1:5), y=c(2, 5, 7, 9, 10))
dfa2 <- data.frame(x=c(1:6), y=c(3, 8, 1, 2, 4, 13))
dfb1 <- data.frame(x=c(1:4), y=c(7, 9, 3, 2))
dfb2 <- data.frame(x=c(1:7), y=c(9, 3, 5, 1, 7, 9, 11))

基于部分元素匹配 'a' 和 'b',我希望列绑定数据框,新列表应如下所示:

new_list
$a
  x  y1 y2
1 1  2  3
2 2  5  8
3 3  7  1
4 4  9  2
5 5 10  4

$b
  x y1 y2
1 1 7  9
2 2 9  3
3 3 3  5
4 4 2  1

这里是 lapplyReduce 的方法。 lapply 遍历字母 "a" 和 "b" 并将 Reduce 应用于名称包含当前字母的列表元素。 Reducemerge 函数应用到两个 data.frames,通过变量 "x" 合并,并使用给定的参数添加所需的后缀。感谢 zx8754 的建议,我添加了 seq_along(grep(let, names(lst))) 以允许变量的最终名称随着组成员的数量而增加。

myList <- lapply(c("a", "b"), function(let)
                              setNames(Reduce(function(x, y) merge(x, y, by="x"),
                                              lst[grep(let, names(lst))]),
                                     c("x", paste0("y", seq_along(grep(let, names(lst)))))))
[[1]]
  x y1 y2
1 1  2  3
2 2  5  8
3 3  7  1
4 4  9  2
5 5 10  4

[[2]]
  x y1 y2
1 1  7  9
2 2  9  3
3 3  3  5
4 4  2  1

要将名称添加到列表中,可能最简单的方法是之后再做,

names(myList) <- c("a", "b")

您也可以从矢量开始

myVec <- c("a", "b")

然后在 lapplynames 行中使用它。