我使用data.table来存储数据 . 我想弄清楚每行中的某些列是否唯一 . 我想在data.table中添加一个列,如果存在重复值,则将保留值“Duplicated Values”,如果没有重复值,则为NA . 我想要检查重复的列的名称存储在字符向量中 . 例如,我创建了我的data.table:
tmpdt<-data.table(a=c(1,2,3,4,5), b=c(2,2,3,4,5), c=c(4,2,2,4,4), d=c(3,3,1,4,5))
> tmpdt
a b c d
1: 1 2 4 3
2: 2 2 2 3
3: 3 3 2 1
4: 4 4 4 4
5: 5 5 4 5
我有另一个变量,指示我需要检查哪些列重复 . 重要的是,我能够将列名存储在字符向量中,而不需要“知道”它们(因为它们将作为参数传递给函数) .
dupcheckcols<-c("a", "c", "d")
我希望输出为:
> tmpdt
a b c d Dups
1: 1 2 4 3 <NA>
2: 2 2 2 3 Has Dups
3: 3 3 2 1 <NA>
4: 4 4 4 4 Has Dups
5: 5 5 4 5 Has Dups
如果我使用的是data.frame,这很容易 . 我可以简单地使用:
tmpdt<-data.frame(a=c(1,2,3,4,5), b=c(2,2,3,4,5), c=c(4,2,2,4,4), d=c(3,3,1,4,5))
tmpdt$Dups<-NA
tmpdt$Dups[apply(tmpdt[,dupcheckcols], 1, function(x) {return(sum(duplicated(x))>0)})]<-"Has Dups"
> tmpdt
a b c d Dups
1 1 2 4 3 <NA>
2 2 2 2 3 Has Dups
3 3 3 2 1 <NA>
4 4 4 4 4 Has Dups
5 5 5 4 5 Has Dups
但我无法弄清楚如何使用data.table完成相同的任务 . 任何帮助是极大的赞赏 .
5 回答
我相信还有其他方法
更复杂但更快(在计算方面)的方法是在
i
中构造过滤条件,然后通过引用在j
中更新我对速度优势很感兴趣,所以我对这两个以及Ananda的解决方案进行了基准测试:
你应该可以做这样的事情:
如果您真的想要单词“Has Dups”,请相应地进行调整,但请注意,使用逻辑值可能更容易,就像我在这里的回答一样 .
我找到了一种方法来使用Rcpp,following an example by hadley (under "Sets"):
要使用它,请将其放在cpp文件中并运行
它在基准测试中做得很好:
如果我去
nc = 50
,@ tospig的expr
变得太长,R无法处理,我得到node stack overflow
,这很有趣 .一个优雅的单线
另一种方法是沿着行列出“tmpdt”并找出哪些行包含多个元素:
窥视
table
,我们可以通过以下方式显着加快速度: