【问题标题】:r - find equal elements in list based on multiple data.frame columns and delete themr - 根据多个 data.frame 列在列表中查找相等的元素并删除它们
【发布时间】:2019-05-15 20:37:18
【问题描述】:

假设我的列表中有以下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_7 和@ 987654341@.

我的真实名单有成千上万的data.frames

有什么建议吗?

【问题讨论】:

    标签: r list dataframe duplicates multiple-columns


    【解决方案1】:

    这是一种方法...

    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 列,使用该列表计算出重复项,然后从原始列表中删除相应的元素(保留每个元素的第一次出现)。

    【讨论】:

    • 可以从df[,c("x","y")]中删除,
    • @snoram 是的,你得到了相同的结果,但是用逗号明显更快 - 在我的机器上 microbenchmark 显示至少快 30%,如果 OP 有一个非常长长的名单。
    • 一个稍短的变体是df_lst[!duplicated(lapply(df_lst, "[", c("x", "y")))]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多