2016-12-08 2 views
0

Я нашел много вопросов, связанных с подмножеством по нескольким условиям, но просто не мог найти, как подмножество не менее двух из> 2 условий.подмножество по крайней мере из двух из нескольких условий

Это так вопрос связанно с той же проблемой, но применяет то же условие для всех столбцов: 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,]) 
    } 

Любые идеи о том, как подмножество всех строк, которые выполняют либо все три, или любую комбинацию два условия?

Большое спасибо заранее!

ответ

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, чтобы подсчитать количество истинных значений для каждой строки. Строки data.frame могут быть подмножеством на основе этого критерия.

+0

спасибо большое @lmo, это решение является простым и понятным! –

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,] 
+0

Спасибо! Для записи есть ли какая-либо ситуация, в которой вы бы порекомендовали это решение по вышеуказанному решению, показанное lmo? –

+0

Функции, которые я использую, намного сложнее, чем gt. –

Смежные вопросы