在R语言中,基于多列的条件,删除重复的行。

6

我有一个数据集,想要删除那些在4列中具有重复信息的数据行。

foo<- data.frame(g1 = c("1","0","0","1","1"), v1 = c("7","5","4","4","3"), v2 = c("a","b","x","x","e"), y1 = c("y","c","f","f","w"), y2= c("y","y","y","f","c"), y3 = c("y","c","c","f","w"), y4= c("y","y","f","f","c"), y5=c("y","w","f","f","w"), y6=c("y","c","f","f","w"))

foo然后看起来像:

  g1 v1 v2 y1 y2 y3 y4 y5 y6
1  1  7  a  y  y  y  y  y  y
2  0  5  b  c  y  c  y  w  c
3  0  4  x  f  y  c  f  f  f
4  1  4  x  f  f  f  f  f  f
5  1  3  e  w  c  w  c  w  w

现在,我想根据Y1-6列的重复数据删除任何行。 因此,只有在所有Y变量完全相同的情况下,才会正确地删除第4行和第1行。 这是一个多列条件。
我认为我已经接近了,但它只是不能正确地工作。
我尝试过:new = foo[!(duplicated(foo[,1:6]))] 认为使用重复命令,它将搜索并仅找到完全匹配的内容?
我考虑使用条件语句与&,但也不知道如何做。
new = foo[foo$y1==foo$y2|foo$y3|foo$y4|foo$y5|foo$y6] 我考虑使用"which",但现在我感到不知所措了。 我希望foo看起来像:
   g1 v1 v2 y1 y2 y3 y4 y5 y6
2  0  5  b  c  y  c  y  w  c
3  0  4  x  f  y  c  f  f  f
5  1  3  e  w  c  w  c  w  w
3个回答

10
> foo[apply(foo[ , paste("y", 1:6, sep = "")], 1,
            FUN = function(x) length(unique(x)) > 1 ), ]
  g1 v1 v2 y1 y2 y3 y4 y5 y6
2  0  5  b  c  y  c  y  w  c
3  0  4  x  f  y  c  f  f  f
5  1  3  e  w  c  w  c  w  w

抱歉,我过于简化了我的例子,因为我有更多的信息列...所以基于仅变量1-6,假设有9个总信息列。我将编辑上面的例子。 - Kerry
我更新了我的答案。现在,行的选择是基于y1-y6列。 - Sven Hohenstein

2
foo[apply(foo, 1, function(x) any(x != x[1])),]

1
> foo[ !rowSums( apply( foo[2:6], 2, "!=", foo[1] ) )==0, ]
  y1 y2 y3 y4 y5 y6
2  c  y  c  y  w  c
3  f  y  c  f  f  f
5  w  c  w  c  w  w

> foo[ ! colSums( apply( foo, 1, duplicated, foo[1] ) ) == 5, ]
  y1 y2 y3 y4 y5 y6
2  c  y  c  y  w  c
3  f  y  c  f  f  f
5  w  c  w  c  w  w

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接