Как фильтровать фрейм данных с условиями двух столбцов?

Я пытаюсь выбрать из фрейма данных. Вопрос в том, почему я последний запрос ниже возвращает все 5 записей не jsut первых двух?

> x <- c(5,1,3,2,4)
> y <- c(1,5,3,4,2)
> data <- data.frame(x,y)
> data
  x y
1 5 1
2 1 5
3 3 3
4 2 4
5 4 2
> data[data$x > 4 || data$y > 4]
  x y
1 5 1
2 1 5
3 3 3
4 2 4
5 4 2

Ответ 1

(1) Для избранных данных (подмножество) я настоятельно рекомендую subset функцию из пакета plyr, написанную Хэдли Викхмом, она чище и проста в использовании:

library(plyr)
subset(data, x > 4 | y > 4)

UPDATE:

Существует более новая версия plyr, называемая dplyr (здесь), которая также из Хэдли, но, предположительно, быстрее и проще использовать. Если вы когда-либо видели operatior как %.% или %>%, вы знаете, что они цепляют операции с помощью dplyr.

result <- data %>%
          filter(x>4 | y>4)  #NOTE filter(condition1, condition2..) for AND operators.

(2) Действительно существуют некоторые различия между | и ||:

Вы можете посмотреть справочное руководство, сделав следующее: ?'|'

The shorter form performs elementwise comparisons in much the same way as arithmetic operators. The longer form evaluates left to right examining only the first element of each vector. Evaluation proceeds only until the result is determined. The longer form is appropriate for programming control-flow and typically preferred in if clauses.

> c(1,1,0) | c(0,0,0)
[1]  TRUE  TRUE FALSE
> c(1,1,0) || c(0,0,0)
[1] TRUE

По вашему вопросу, что вы сделали, в основном data[TRUE], который... вернет полный фрейм данных.

Ответ 2

Здесь что-то работает для меня.

data[data[,1] > 4 | data[,2] > 4,1:2]

Я точно не знаю, почему ваш метод не работает, но я думаю, что это потому, что вы не говорите, когда не печатаете. Посмотрите help("[").

Ответ 3

Взять ваш точный код и слегка его изменить

> x <- c(5,1,3,2,4)
> y <- c(1,5,3,4,2)
> data <- data.frame(x,y)
> data[data$x > 4 | data$y > 4,]
  x y
1 5 1
2 1 5

Следует отметить две важные вещи. Первый заключается в том, что || был изменен на |, а второй - на наличие дополнительной запятой (,) непосредственно перед последней квадратной скобкой, что позволяет фильтру работать правильно.