子集由多个条件中的至少两个组成

时间:2016-12-08 14:29:03

标签: r subset

我发现很多问题涉及多个条件的子集化,但是无法找到如何通过至少两个从> 2条件中进行子集化。

此SO问题处理同样的问题,但对所有列应用相同的条件: Select rows with at least two conditions from all conditions

我的问题是:如何根据三种不同条件中的至少两种来对行进行子集化?

id<-c(1,2,3,4,5)
V1<-c(2,4,4,9,7)
V2<-c(10,20,20,30,20)
V3<-c(0.7,0.1,0.5,0.2,0.9)
df<-data.frame(cbind(id,V1,V2,V3))

我可以通过循环遍历满足三个条件中三个条件的行:

#empty "subset" data.frame
subdf <- cbind(as.character(),as.numeric(),as.numeric(),as.numeric())
colnames(subdf) <- colnames(df)

for (i in 1:nrow(df)){
    if (df$V1[i] <= 4 && df$V2[i] >= 20 && df$V3[i] <= 0.3)
    subdf <- rbind(subdf,df[i,])
    }

关于如何对满足所有三个或两个条件的任意组合的所有行进行子集的任何想法?

非常感谢提前!

2 个答案:

答案 0 :(得分:1)

以下是LukeA's answer的扩展名。

dfNew <- df[rowSums(cbind(df$V1 <= 4, df$V2 >= 20, df$V3 <= 0.3)) > 1,]

返回

dfNew
  id V1 V2  V3
2  2  4 20 0.1
3  3  4 20 0.5
4  4  9 30 0.2

我们的想法是使用cbind构造逻辑向量的矩阵,然后使用rowSums计算每行的TRUE值的数量。然后,data.frame的行可以基于此标准进行子集化。

答案 1 :(得分:0)

我用诡计做类似的事情。看看你是否喜欢它。 方法是将条件转换为文本并使用eval

id<-c(1,2,3,4,5)
V1<-c(2,4,4,9,7)
V2<-c(10,20,20,30,20)
V3<-c(0.7,0.1,0.5,0.2,0.9)
df<-data.frame(cbind(id,V1,V2,V3))

tests<- c("df$V1 <= 4","df$V2 >= 20" ,"df$V3 <= 0.3")

tests
res<- sapply(tests,FUN = function(txt){eval(parse(text=txt))} )
apply(res,1,sum)
df[apply(res,1,sum) >=2,]