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

时间:2017-08-25 19:18:56

标签: r list dataframe merge cbind

我有一个清单:

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))

基于部分元素匹配&#39; a&#39;和&#39; b&#39;,我希望列绑定dataframem,新列表应如下所示:

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

1 个答案:

答案 0 :(得分:4)

以下是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&lt; - c(“a”,“b”)

然后在lapplynames行中使用它。