which
может быть полезно (с помощью экономии как компьютерных, так и человеческих ресурсов), например, если вам необходимо отфильтровать элементы фрейма / матрицы данных по заданной переменной / столбцу и обновить другие переменные / столбцы на основе этого,Пример:
df <- mtcars
Вместо:
df$gear[df$hp > 150] <- mean(df$gear[df$hp > 150])
Вы можете сделать:
p <- which(df$hp > 150)
df$gear[p] <- mean(df$gear[p])
Дополнительный случай будет, если вам придется фильтровать фильтрованные элементы, что можетне следует делать с простыми &
или |
, например, когда вам нужно обновить некоторые части фрейма данных на основе других таблиц данных.Таким образом, требуется хранить (хотя бы временные) индексы отфильтрованного элемента.
Еще одна проблема, которая приходит мне в голову, если вам нужно выполнить цикл как часть фрейма / матрицы данных или сделать этодругие виды преобразований, требующие знания индексов нескольких случаев.Пример:
urban <- which(USArrests$UrbanPop > 80)
> USArrests[urban, ] - USArrests[urban-1, ]
Murder Assault UrbanPop Rape
California 0.2 86 41 21.1
Hawaii -12.1 -165 23 -5.6
Illinois 7.8 129 29 9.8
Massachusetts -6.9 -151 18 -11.5
Nevada 7.9 150 19 29.5
New Jersey 5.3 102 33 9.3
New York -0.3 -31 16 -6.0
Rhode Island -2.9 68 15 -6.6
Извините за фиктивные примеры, я знаю, что не имеет большого смысла сравнивать наиболее урбанизированные штаты США по штатам, предшествующим алфавитным, но я надеюсь, что это имеет смысл :)
Проверка which.min
и which.max
также дает некоторую подсказку, поскольку вам не нужно много печатать, например:
> row.names(mtcars)[which.max(mtcars$hp)]
[1] "Maserati Bora"