我有一个带有ID列的数据框和几个属性列。我想删除数据框中的所有行,其中任何一个属性列(或多个)与任何其他属性列相同。换句话说,我只想保留行中每个属性都是唯一值的行。
例如,使用此代码:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<tbody>
<tr>
<td><a class='edit-link' id='jobid-3'>Motion Designer</a></td>
<td>2015-07-21 11:06:57</td>
</tr>
<tr>
<td><a class='edit-link' id='jobid-2'>Web Developer</a></td>
<td>2015-07-21 09:53:36</td>
</tr>
<tr>
<td><a class='edit-link' id='jobid-1'>Creative Team Manager</a></td>
<td>2015-07-21 09:41:20</td>
</tr>
</tbody>
导致此数据帧:
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为#34; d&#34;。
我已经找到了这样做的方法,但是这个特殊的问题(在行中是唯一的)我不确定如何解决 - 如果它们是列,那就很容易了。
提前致谢!
答案 0 :(得分:2)
您可以尝试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