2015-02-05 4 views
2

У меня есть большой набор данных, который я пытаюсь фильтровать на основе значения из двух отдельных столбцов. Для каждой строки у меня есть столбец, показывающий их общее количество (tot) и столбец, показывающий общее количество раз, когда тип образца был просмотрен (tot.type).Выбор строк на основе нескольких условий с использованием OR вместо AND в R

Я хочу отфильтровать свои данные на основе обоих (tot) и (tot.type), где (tot) ИЛИ (tot.type) должно быть больше или равно 2, например.

Все примеры, которые я нашел для фильтрации на основе нескольких значений с помощью «И», но ничего, где вы используете «ИЛИ» ...

Example data: 
name = c("A","B","C","D","E") 
rx = c(1,0,2,1,1) 
ry = c(0,1,1,0,0) 
rz = c(0,0,2,2,3) 
type = c("p","q","r","p","r") 
tot = c(1,1,5,3,4) 
tot.type = c(2,1,2,2,2) 
test = data.frame(name,rx,ry,rz,tot,tot.type) 

В этом примере я не отбросит строку B, и держать остальных ,

Я отфильтровал данные на 2 отдельных набора данных на основе только одного столбца или другого, а затем объединил их, но это можно сделать в одной строке, которая генерирует один набор данных, а не делает два отдельных и объединяет их позже?

ответ

2

subset предназначен именно для этого:

subset(test, tot.type >= 2 | tot >= 2) 
+0

Спасибо, это работает отлично. Так просто, но так сложно найти ответ самостоятельно. –

+0

Кстати, это условие «или» имеет альтернативную формулировку: 'подмножество (test, pmax (tot, tot.type)> = 2)' Как правило, мышление о математике может помочь упростить вычисления. – Frank

+0

@Frank, хорошее предложение. – BrodieG

2

Попробуйте

test[test$tot>=2 | test$tot.type>=2,] 

(п.с. я думаю, что есть ошибка в вашем примере, вы хотите

test = data.frame(name,rx,ry,rz,type,tot,tot.type) 

вместо

test = data.frame(name,rx,ry,rz,tax,tot,N.tax) 

?

+0

зафиксировано, что. Благодарю. –

1

Вы можете использовать rowSums. (" тест»основан на данных @ CactusWoman в)

test[!!rowSums(test[c('tot', 'tot.type')]>=2),]) 

Или другой вариант

test[unique(which(test[c("tot","tot.type")] >= 2, 
          arr.ind = TRUE)[, 1]), ] 
+0

Я пропустил какую-то внутреннюю шутку здесь? Кроме того, @DavidArenburg, вы должны получить значок для быстрого редактирования. Было похоже, что вы отредактировали это почти до того, как я попал в submit! – BrodieG

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