r-在基于多个data.frame列的列表中找到相等的元素并将其删除



假设我的列表中有以下data.frames

df_1 = data.frame(x = c(1,2,2,5,6), y = c(20,20,21,24,55), z = rnorm(5))
df_2 = data.frame(x = c(1,2,2,5,6), y = c(20,20,21,24,55), z = rnorm(5))
df_3 = data.frame(x = c(3,3,5,6), y = c(20,20,21,24), z = rnorm(4))
df_4 = data.frame(x = c(1,2,2), y = c(20,20,21), z = rnorm(3))
df_5 = data.frame(x = c(2,2,5,6), y = c(19,20,21,40), z = rnorm(4))
df_6 = data.frame(x = c(1,5,6), y = c(20,20,24), z = rnorm(3))
df_7 = data.frame(x = c(1,5,6), y = c(20,20,24), z = rnorm(3))
df_8 = data.frame(x = c(1,5,6), y = c(20,20,24), z = rnorm(3))
df_lst = list(df_1, df_2, df_3, df_4, df_5, df_6, df_7, df_8)

如您所见,df_1df_2具有相同的xy列,这同样适用于df_6df_7df_8

如何删除基于列xy的重复data.frames

我不在乎删除了哪个df,也就是说,它可以是df_1df_2df_6df_7,或df_6df_8,或df_7df_8

我的真实列表中有数千个data.frames

有什么建议吗?

这里有一种方法。。。

df_lst[!duplicated(lapply(df_lst, function(df) df[,c("x","y")]))]
[[1]]
x  y          z
1 1 20 -0.8043316
2 2 20 -1.0565257
3 2 21 -1.0353958
4 5 24 -1.1855604
5 6 55 -0.5004395
[[2]]
x  y          z
1 3 20  0.3509210
2 3 20  0.8633185
3 5 21 -0.4789113
4 6 24 -1.1884792
[[3]]
x  y           z
1 1 20 -0.26856637
2 2 20 -0.08022106
3 2 21 -0.12323569
[[4]]
x  y           z
1 2 19 -0.09943981
2 2 20 -0.83475398
3 5 21  1.85777954
4 6 40 -0.49839702
[[5]]
x  y          z
1 1 20 -1.2700546
2 5 20 -0.9369437
3 6 24  0.5334392

首先,它形成一个仅包括每个数据帧的列xy的伪列表,使用该列表计算出重复项,然后从原始列表中删除相应的元素(保留每个元素的第一次出现(。

最新更新