我在R中有一个两列数据框,假设它类似于以下
V1 V2
1 2
2 4
1 2
2 3
1 2
...
如果V1中的值出现多次,并且这些具有公共V1值的行具有不同的V2值,请将其过滤掉。
我怎样才能在R中有效地做到这一点?我想我需要使用一些哈希功能,对吧?但我不知道该怎么做。
谢谢。
答案 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} ), ]