我有一个清单:
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
答案 0 :(得分:4)
以下是lapply
和Reduce
的方法。 lapply
遍历字母“a”和“b”,并将Reduce
应用于名称中包含当前字母的列表元素。 Reduce
将merge
函数应用于两个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”)
然后在lapply
和names
行中使用它。