根据名称的部分匹配合并列表中数据框的元素
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
这里是 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 <- c("a", "b")
然后在 lapply
和 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
这里是 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 <- c("a", "b")
然后在 lapply
和 names
行中使用它。