Попался с логическим индексированием и "который" в R

r indexing which

6210 просмотра

2 ответа

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

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

Автор: dwh Источник Размещён: 05.07.2019 11:43

Ответы (2)


10 плюса

Решение

Имейте в виду, что 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
Автор: nullglob Размещён: 14.06.2011 08:27

6 плюса

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] 6 7 8 9 10

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

x[x > 5]

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

x[which(x > 5)]

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

Автор: mdsumner Размещён: 14.06.2011 02:32
Вопросы из категории :
32x32