删除其中任意几列重复的行
Deleting rows where any of several columns is a duplicate
我有一个带有 ID 列和几个属性列的数据框。我想删除我的数据框中的所有行,其中任何一个属性列(或多个)与任何其他属性列相同。换句话说,我只想保留行中每个属性都是唯一值的行。
例如,使用此代码:
example = data.frame(id = c("a", "b", "c", "d"), attr1 = seq(1,4), attr2 = c(2, 3, 3, 1), attr3 = c(1, 2, 3, 3))
导致此数据框:
id attr1 attr2 attr3
a 1 2 1
b 2 3 2
c 3 3 3
d 4 1 3
我想删除除最后一行以外的所有行,ID 为 "d"。
我一直在寻找方法来做到这一点,但我不确定如何解决这个特殊问题(在行中是唯一的)——如果它们是列,那就很容易了。
提前致谢!
你可以试试anyDuplicated
example[!apply(example[-1], 1, anyDuplicated),]
# id attr1 attr2 attr3
#4 d 4 1 3
或者
example[apply(example[-1],1, function(x) length(unique(x))==3),]
或使用regex
example[!nzchar(sub('^(?:([0-9])(?!.*\1))*$', '',
do.call(paste0, example[-1]), perl=TRUE)),]
基准
example1 <- example[rep(1:nrow(example),1e6),]
system.time(example1[!apply(example1[-1], 1, anyDuplicated),])
# user system elapsed
# 32.953 0.222 33.239
system.time(example1[!apply(example1[-1], 1,
function(x) length(unique(x))==3),])
# user system elapsed
# 35.409 0.185 35.659
system.time(example1[!nzchar(sub('^(?:([0-9])(?!.*\1))*$',
'', do.call(paste0, example1[-1]), perl=TRUE)),])
# user system elapsed
# 10.033 0.020 10.069
我有一个带有 ID 列和几个属性列的数据框。我想删除我的数据框中的所有行,其中任何一个属性列(或多个)与任何其他属性列相同。换句话说,我只想保留行中每个属性都是唯一值的行。
例如,使用此代码:
example = data.frame(id = c("a", "b", "c", "d"), attr1 = seq(1,4), attr2 = c(2, 3, 3, 1), attr3 = c(1, 2, 3, 3))
导致此数据框:
id attr1 attr2 attr3
a 1 2 1
b 2 3 2
c 3 3 3
d 4 1 3
我想删除除最后一行以外的所有行,ID 为 "d"。
我一直在寻找方法来做到这一点,但我不确定如何解决这个特殊问题(在行中是唯一的)——如果它们是列,那就很容易了。
提前致谢!
你可以试试anyDuplicated
example[!apply(example[-1], 1, anyDuplicated),]
# id attr1 attr2 attr3
#4 d 4 1 3
或者
example[apply(example[-1],1, function(x) length(unique(x))==3),]
或使用regex
example[!nzchar(sub('^(?:([0-9])(?!.*\1))*$', '',
do.call(paste0, example[-1]), perl=TRUE)),]
基准
example1 <- example[rep(1:nrow(example),1e6),]
system.time(example1[!apply(example1[-1], 1, anyDuplicated),])
# user system elapsed
# 32.953 0.222 33.239
system.time(example1[!apply(example1[-1], 1,
function(x) length(unique(x))==3),])
# user system elapsed
# 35.409 0.185 35.659
system.time(example1[!nzchar(sub('^(?:([0-9])(?!.*\1))*$',
'', do.call(paste0, example1[-1]), perl=TRUE)),])
# user system elapsed
# 10.033 0.020 10.069