【问题标题】:How to identify only "not duplicated" rows如何仅识别“不重复”的行
【发布时间】:2016-05-27 14:57:14
【问题描述】:

我有这样的情况。 多个data.table“绑定”。

library(data.table)
x <-  data.table(id=c(1,2,3,4),dsp=c(5,6,7,8),status=c(FALSE,TRUE,FALSE,TRUE))
y <-  data.table(id=c(1,2,3,4),dsp=c(6,6,7,8),status=c(FALSE,FALSE,FALSE,TRUE))
z <- data.table(id=c(1,2,3,4),dsp=c(5,6,9,8),status=c(FALSE,TRUE,FALSE,FALSE))
w <- data.table(id=c(1,2,3,4),dsp=c(5,6,7,NA),status=c(FALSE,TRUE,FALSE,TRUE))
setkey(x,id)
setkey(y,id)
setkey(z,id)
setkey(w,id)
Bigdt<-rbind(x,y,z,w)

我只想获取不重复的行,例如:

id  dsp status
1   6   FALSE
2   6   FALSE
3   9   FALSE
4   8   FALSE
4   NA  TRUE

所以我尝试了

Resultdt<-Bigdt[!duplicated(Bigdt)]

但是结果:

id  dsp status
1   5   FALSE
2   6   TRUE
3   7   FALSE
4   8   TRUE

不符合我的看法。 我尝试了不同的方法(因为 rbind 不是强制性的),例如合并、连接等。 data.table 包似乎可能是包含解决方案的包......显然。有什么想法吗?

【问题讨论】:

  • 代码对我来说很好(通过从这里复制粘贴),弗兰克,对不起,但你的代码没有给出预期的结果......
  • 正确!抱歉,我会编辑,但是其他行呢?
  • 这是我得到的:id dsp status N 1 6 FALSE 1 2 6 FALSE 1 3 9 FALSE 1 4 8 FALSE 1 4 NA TRUE 1
  • 这是 R 的一般问题,答案类似于下面的@akrun 之一stackoverflow.com/q/13763216

标签: r data.table


【解决方案1】:

你可以的

Bigdt[, .N, by=names(Bigdt)][N == 1L][, N := NULL][]

   id dsp status
1:  1   6  FALSE
2:  2   6  FALSE
3:  3   9  FALSE
4:  4   8  FALSE
5:  4  NA   TRUE

要查看它是如何工作的,只需运行DT[][][][] 链的一部分:

  • Bigdt[, .N, by=names(Bigdt)]
  • Bigdt[, .N, by=names(Bigdt)][N == 1L]
  • Bigdt[, .N, by=names(Bigdt)][N == 1L][, N := NULL]

【讨论】:

  • 谢谢弗兰克! :)
  • 如果您使用 Frank 的解决方案达到内存限制,您可以选择使用 dt[, N := rowidv(dt)] 将重复行序列就地添加到数据集,然后在 N==1L 上设置子集。
  • @jangorecki 必须为此对数据表进行排序?我会把它添加到答案中。随意编辑任何其他细节或替代方案。
  • @Frank no,见rowidv(data.table(c("c","a","c","b","c","a"))),它广泛用于使用all=TRUE 功能处理重复的集合运算符。刚刚意识到它不会回答问题,因为它会列出所有唯一的行 - 然后将其从答案中删除。
【解决方案2】:

你也可以试试

Bigdt[!(duplicated(Bigdt)|duplicated(Bigdt, fromLast=TRUE))]
#   id dsp status
#1:  1   6  FALSE
#2:  2   6  FALSE
#3:  3   9  FALSE
#4:  4   8  FALSE
#5:  4  NA   TRUE

或者如果我们使用.SD

Bigdt[Bigdt[,!(duplicated(.SD)|duplicated(.SD, fromLast=TRUE))]]

或者另一种选择是按列名分组,使用.I 查找行索引并将数据集子集

Bigdt[Bigdt[, .I[.N==1], by = names(Bigdt)]$V1]

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多