根据条件从 r 中的多列中删除重复的行

Posted

技术标签:

【中文标题】根据条件从 r 中的多列中删除重复的行【英文标题】:remove duplicate rows based on conditions from multiple columns in r 【发布时间】:2012-09-07 16:05:58 【问题描述】:

我有一个数据集,我想删除在 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 列删除任何包含重复数据的行。因此,如果操作正确,则仅会删除第 4 行和第 1 行,因为所有 Y 变量都完全相同。它是一个多列条件。

我相信我已经接近了,但它只是无法正常工作。

我试过了:new = foo[!(duplicated(foo[,1:6]))] 考虑使用重复的命令,它会搜索并只找到那些完全匹配的?

我曾想过使用带有 & 的条件语句,但也不知道该怎么做。new = foo[foo$y1==foo$y2|foo$y3|foo$y4|foo$y5|foo$y6]

我想过哪个,但我现在不知所措,迷失了方向。我希望 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

【问题讨论】:

【参考方案1】:
> 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 列信息。我将编辑上面的例子 我更新了我的答案。现在,行的选择基于列 y1 - y6。【参考方案2】:
foo[apply(foo, 1, function(x) any(x != x[1])),]

【讨论】:

【参考方案3】:
> 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

【讨论】:

以上是关于根据条件从 r 中的多列中删除重复的行的主要内容,如果未能解决你的问题,请参考以下文章

有条件地删除R中的行

根据“如果单元格中的字符串”条件删除熊猫列中的行

R:从R中的大型数据集中根据列中的值删除行[重复]

根据条件对 BigQuery 中的行进行重复数据删除

如何从R中的数据框中删除重复的行[重复]

pandas:删除两列中具有相同索引的行中的重复值