Попался с логическим индексированием и "который" в R - PullRequest
5 голосов
/ 14 июня 2011

Есть ли в R обстоятельства, когда использование which для индексации не может быть смешано с логическим индексированием в R?Кажется, я вспомнил, что встречался с этими двумя несколько месяцев назад - что-то со вкусом R, поддерживающим некоторое внутреннее представление о номере строки, и это не очень хорошо сочеталось с использованием «which» после того, как я использовал логическое индексирование в другом местеотбросить несколько рядов.

Это известное явление или мне снилось все это?

Ответы [ 2 ]

10 голосов
/ 14 июня 2011

Помните, что NA и другие подобные записи могут запутать ситуацию Следующий пример @ mdsumner:

> x <- c(1:10,NA,NaN,Inf)
> x > 5
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE    NA    NA
[13]  TRUE
> x[x > 5]
[1]   6   7   8   9  10  NA  NA Inf
> x[which(x > 5)]
[1]   6   7   8   9  10 Inf
6 голосов
/ 14 июня 2011

which возвращает номера индексов для выбора элементов из вектора или срезов из матрицы / массива или data.frame, и их нельзя «смешать» с логическими векторами

Рассмотрим логический вектор для всех чисел> 5 в этом векторе:

x <- 1:10
x > 5
[1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

Это логический вектор из 10 элементов, но эквивалент которого () имеет длину 5:

, который (x> 5) [1] 67 8 9 10

Нет ничего сложного в том, что нельзя смешивать эти вещи, они просто не идут вместе.Первый неявно отбрасывает первые пять элементов и сохраняет последние пять в силу сопоставления позиций между данными и логическим вектором

x[x > 5]

, а второй явно выбирает только последние пять элементов

x[which(x > 5)]

Тот же результат, но аргумент оператора "[" в каждом случае совершенно разный.Это применяется независимо от того, являются ли выбранные элементы одноэлементными значениями в векторе или строками в data.frame.

...