删除多个列中的任何一列是重复的行

时间:2015-07-21 19:35:16

标签: r unique data-manipulation

我有一个带有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;。

我已经找到了这样做的方法,但是这个特殊的问题(在行中是唯一的)我不确定如何解决 - 如果它们是列,那就很容易了。

提前致谢!

1 个答案:

答案 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