我在 R 中有一个两列数据框,假设它如下所示
V1 V2
1 2
2 4
1 2
2 3
1 2
...
如果 V1 中的值出现不止一次,并且这些具有共同 V1 值的行具有不同的 V2 值,则将它们过滤掉。
我怎样才能在 R 中有效地做到这一点?我想我需要使用一些哈希功能,对吧?但我不知道该怎么做。
谢谢你。
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
改为显示省略重复的不一致行。
在问题说明中使用不定代词容易被误解。我正在展示的代码将“它们”解释为“V1 的值与多个 V2 的值相关联的所有行实例”,并且“过滤器”被解释为在 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} ), ]