我制作了一个数据帧,其中包含一组变量的所有组合,但是我只对其中这些值中只有一个与参考值集不同的行感兴趣。
因此,如果感兴趣的值是:
V1int <- 1
V2int <- 2
V3int <- 3
我的数据框是:
df<-data.frame("V1"=c(1,1,2,1), "V2"=c(2,2,2,3), "V3"=c(3,1,3,2))
然后我想要前三行(c(1,2,3),c(1,2,1)和c(2,2,3)),而不是第四行(c(1, 3,2)),因为在前三行中只有一个值不正确,而在最后一行中只有两个值不正确。
我想象必须有某种“或”语句可以生成所有合适的值组合,然后我可以将其作为数据帧的子集,但是我不确定。我有10列和40,000个值组合,因此不能完全分别指定所需值的组合。
谢谢!
答案 0 :(得分:1)
您可以尝试
df[apply(df, 1, function(x) sum(1:3 == x) >= 2), ]
# V1 V2 V3
#1 1 2 3
#2 1 2 1
#3 2 2 3
其中1:3
是c(V1int, V2int, V3int)
的缩写。
这个想法是将每行的元素与1:3
进行比较,然后检查至少两个元素是否相同。结果是一个逻辑向量,我们将其用于子集数据。
另一个选择是
df[colSums(t(df) == 1:3) >= 2, ]
答案 1 :(得分:0)
另一个角度
样本数据
df<-data.frame("V1"=c(1,1,2,1), "V2"=c(2,2,2,3), "V3"=c(3,1,3,2))
V1int <- 1
V2int <- 2
V3int <- 3
代码
reference <- c( V1int, V2int, V3int )
df[ apply( df, 1, function(x) length( which( as.vector(x) == reference ) ) ) > 1, ]
# V1 V2 V3
# 1 1 2 3
# 2 1 2 1
# 3 2 2 3