找出不一致的数据

时间:2013-07-03 22:50:16

标签: r dataset subset

我在R中有一个两列数据框,假设它类似于以下

V1 V2
1 2
2 4
1 2
2 3
1 2
...

如果V1中的值出现多次,并且这些具有公共V1值的行具有不同的V2值,请将其过滤掉。

我怎样才能在R中有效地做到这一点?我想我需要使用一些哈希功能,对吧?但我不知道该怎么做。

谢谢。

2 个答案:

答案 0 :(得分:1)

1)试试这个:

DF <- data.frame(V1 = c(1L, 2L, 1L, 2L, 1L), V2 = c(2L, 4L, 2L, 3L, 2L))

is.ok <- function(x) var(range(x)) == 0
subset(DF, ave(V2, V1, FUN = is.ok) == 1) 

最后一行的结果是:

  V1 V2
1  1  2
3  1  2
5  1  2

要获取不一致的数据而不是一致的数据,请在最后一个代码行中将== 1更改为== 0

2)如果您不想显示重复项,则会显示一致的行但不重复:

subset(unique(DF), ave(V2, V1, FUN = length) == 1)

这给出了:

  V1 V2
1  1  2

将代码中的== 1更改为> 1,以显示不一致的行,省略重复项。

答案 1 :(得分:0)

在问题规范中使用不定代词很容易被误解。我显示的代码将“他们”解释为“V1的值与V2的多个值相关联的行的所有实例”,并且“filter”被解释为在data.frame中传递它们以供检查。

  more.than.one.V2 <- dfrm[ave(dfrm$V2, dfrm$V1, 
                             FUN=function(x){length(unique(x))!=1} ), ]
  only.one.V2 <- dfrm[ave(dfrm$V2, dfrm$V1, 
                             FUN=function(x){length(unique(x))==1} ), ]