【问题标题】:Remove "repeats" in column values for R data.table删除 R data.table 列值中的“重复”
【发布时间】:2021-09-19 22:46:43
【问题描述】:

如何通过列之间的“对”重复值来过滤 R data.table?

我有以下 R data.table,行之间有“重复”,因此这些值相互镜像:

library(data.table)

dt = data.table(A=c(1, 5, 9, 3, 7, 11), B=c(2, 6, 10, 4, 8, 12), 
     C=c(3, 7, 11, 1, 5, 9), D=c(4, 8, 12, 2, 6, 10),
     E=c(47, 21, 45, 27, 40, 33), F=c(27, 40, 33, 47, 21, 45))


print(dt)
#     A  B  C  D  E  F
# 1:  1  2  3  4 47 27
# 2:  5  6  7  8 21 40
# 3:  9 10 11 12 45 33
# 4:  3  4  1  2 27 47
# 5:  7  8  5  6 40 21
# 6: 11 12  9 10 33 45

“镜像副本”是指:如果您查看第 3、4、5 行,这些是第 0、1、2 行的“镜像副本”。第 0、1、2 行中的 A 列和 B 列是第 3、4、5 行中的 C 和 D 列。

例如,在第 0 行,['A', 'B', 'C', 'D'] 是 [1, 2, 3, 4]。在第 3 行,['A', 'B', 'C', 'D'] 是 [3, 4, 1, 2]。

E 和 F 列也是如此——第 0、1、2 行中的 E 值是第 3、4、5 行中的 F 值。

我想删除这些“镜像复制”行,只保留“唯一”对。上面的正确输出应该是:

##     A   B   C   D   E   F
## 1   1   2   3   4  47  27
## 2   5   6   7   8  21  40
## 3   9  10  11  12  45  33

##     A   B   C   D   E   F
## 1   3   4   1   2  27  47
## 2   7   8   5   6  40  21
##   11  12   9  10  33  45

但不是两者——只有一个行的副本。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可能需要遍历行并排序。在collapse 中可能更快,即使用collapse 中更快版本的apply dapply,指定MARGIN = 1(即循环遍历行)并应用更快版本的sort (fsort ),然后使用 unique 应用于新数据 by 所有列(或只是 unique(dt1)

    library(data.table)
    library(collapse)
    dt1 <- dapply(dt, MARGIN = 1, FUN = fsort)
    unique(dt1, by = names(dt1))
       A  B  C  D  E  F
    1: 1  2  3  4 27 47
    2: 5  6  7  8 21 40
    3: 9 10 11 12 33 45
    

    或使用duplicated

    dt[dt1[, !duplicated(.SD)]]
    

    【讨论】:

    • 这太棒了!包裹collapse 看起来很棒。您能解释一下上述解决方案的工作原理吗?
    • @EB2127 谢谢,我更新了一些描述
    • 我还会用dt[dt1[, !duplicated(.SD)]] 重新添加答案。两者都有效。
    • @EB2127 是的,但是uniqueby 选项来自data.table,所以我认为它更适合您,因为您正在使用dat.atable
    • 实际上,在我的示例中,dt[dt1[, !duplicated(.SD)]] 保留了列中值的顺序,而 unique(dt1, by = names(dt1)) 没有。
    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 2020-05-03
    • 2015-02-05
    • 2013-09-28
    • 1970-01-01
    • 2018-01-15
    • 2018-08-23
    • 2015-05-06
    相关资源
    最近更新 更多