【问题标题】:How to remove all duplicated rows in data.table in r如何在 r 中删除 data.table 中的所有重复行
【发布时间】:2016-01-20 00:57:49
【问题描述】:

假设我们有

library(data.table)    
dt <- data.table(Date = c(201405,201405,201504,201505, 201505,201505), ID = c(500,500,600,700,500, 700), INC = c(20,30,50,75,80,90))

返回,

     Date  ID INC
1: 201405 500  20
2: 201405 500  30
3: 201504 600  50
4: 201505 700  75
5: 201505 500  80
6: 201505 700  90

我想删除同一日期中的所有 ID。回报应该是

     Date  ID INC
1: 201504 600  50
2: 201505 500  80

你能推荐一下吗?

【问题讨论】:

    标签: r duplicates data.table


    【解决方案1】:

    我们按 'ID' 分组,在 'Date' 上得到一个带有duplicated 的逻辑索引,然后取反以使所有唯一元素现在都为 TRUE,使用 .I 获取行索引,提取索引列'V1' 并将其用于子集 'dt'。

    dt[dt[, .I[!(duplicated(Date)|duplicated(Date, fromLast=TRUE))], ID]$V1]
    #      Date  ID INC
    #1: 201505 500  80
    #2: 201504 600  50
    

    或者另一种选择是按“日期”、“ID”和if 分组,nrow 等于 1 (.N==1),我们得到 Data.table 的子集 (.SD)。

    dt[, if(.N==1) .SD, .(Date, ID)]
    #     Date  ID INC
    #1: 201504 600  50
    #2: 201505 500  80
    

    或者正如@Frank 提到的,我们可以使用 data.table/base R 组合

    DT[ave(seq(.N), Date, ID, FUN = function(x) length(x) == 1L)]
    

    【讨论】:

    • 我在dt[dt[, !(duplicated(ID)|duplicated(ID,fromLast=TRUE)), by=Date]$V1]有一个类似的
    • @thelatemail 看起来也不错。我通常选择.I
    • 我会考虑DT[ave(seq(.N), Date, ID, FUN = function(x) length(x) == 1L)]。不是很data.table-ish,但它不需要使用by 或使用duplicated 扫描向量两次。
    • @Frank - 它实际上确实使用了by,因为ave 在内部调用lapply + split
    • @thelatemail 无论如何,我怀疑用by 分割data.frames 比分割单个向量有更多开销......哦 - 只是测试一下我是否可以制作一个例如,我的 R 会话在半秒内完成 if (...) .SD 后挂在 ave 上,所以......是的。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2021-05-22
    • 2016-06-01
    • 2012-05-21
    相关资源
    最近更新 更多