我在列表L中有4个数据帧,如下所示:
L[[1]]:
V1 V2
B C
A B
Z B
L[[2]]:
V1 V2
B D
A B
Z B
L[[3]]:
V1 V2
Z Y
X Z
N Z
L[[4]]:
V1 V2
Z J
X Z
N Z
这来自头部C,D,Y和J的图形。 显然,C和D来自同一个图,Y和J.也是如此。 如果这些数据帧在列表L?
中,如何将C与D和Y合并为J.我在想的是,迭代列表和成对比较。如果dfx与dfy merge相交。任何人都可以帮助使用R代码吗?
编辑: 我在想的是这样的: 获取第一个元素,比较第二个元素,如果没问题,合并并保存到第一个元素,删除第二个元素,移动到下一个元素直到最后一个元素。重复,直到剩余元素未被删除。有了这个,列表将包含已合并的剩余元素任何人都知道如何在代码中实现它? 预期产出:
L[[1]]:
V1 V2
B C
B D
A B
Z B
L[[2]]:
V1 V2
Z Y
Z J
X Z
N Z
答案 0 :(得分:0)
这可能是一种解决方案吗?
# create list of data.frames
ld <- list(
data.frame(V1 = c("B","A","Z"), V2 = c("C","B","B")),
data.frame(V1 = c("B","A","Z"), V2 = c("D","B","B")),
data.frame(V1 = c("Z","X","N"), V2 = c("Y","Z","Z")),
data.frame(V1 = c("Z","X","N"), V2 = c("J","Z","Z"))
)
# suggested solution
union_ld <- data.table::rbindlist(ld)
unique(union_ld)
结果:
V1 V2
1: B C
2: A B
3: Z B
4: B D
5: Z Y
6: X Z
7: N Z
8: Z J
快速入侵:OP请求的列表中的两个数据帧。根据OP的评论,每个结果数据框中行的顺序并不重要。
list(
unique(data.table::rbindlist(ld[1:2])),
unique(data.table::rbindlist(ld[3:4]))
)
结果:
[[1]]
V1 V2
1: B C
2: A B
3: Z B
4: B D
[[2]]
V1 V2
1: Z Y
2: X Z
3: N Z
4: Z J
建议的解决方案将列表中的前两个数据帧合并为一个数据帧,删除重复的行。对列表中的最后两个数据帧重复此操作。然后,结果数据帧再次组合成一个列表。
此解决方案使用包rbindlist
中的data.table
。如果您不喜欢这样,结果可以返回为&#34; pure&#34;像这样的数据框
library(data.table)
list(
setDF(unique(rbindlist(ld[1:2]))),
setDF(unique(rbindlist(ld[3:4])))
)
根据OP的评论,有更多的数据框需要在几个小组中合并。
# set up a list of vectors of numbers of data.frames to combine
dfs_to_combine <- list(c(1:2), c(3:4))
dfs_to_combine
[[1]]
[1] 1 2
[[2]]
[1] 3 4
# now, combine data.frames as specified
library(data.table)
lapply(dfs_to_combine, function(x) setDF(unique(rbindlist(ld[x]))))
[[1]]
V1 V2
1 B C
2 A B
3 Z B
4 B D
[[2]]
V1 V2
1 Z Y
2 X Z
3 N Z
4 Z J
这只是为了重现您的初始示例。如果你想以不同的方式组合改变数字,例如,
dfs_to_combine <- list(c(1), c(2, 4), c(3))