Почему “ “ лучше, чем `подмножество`?
Когда мне нужно отфильтровать data.frame, т. Е. Извлечь строки, соответствующие определенным условиям, я предпочитаю использовать функцию subset
:
subset(airquality, Month == 8 & Temp > 90)
Вместо функции [
function:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Для моих предпочтений есть две основные причины:
- Вычисление всех подмножеств набора чисел
- Удалите группы с менее чем тремя уникальными наблюдениями
- найти все подмножества, которые суммируются с определенным значением
- Сплит / подмножество кадра данных по факторам в одном столбце
- Как подмножить данные в R без потери строк NA?
-
Я считаю, что код читается лучше, слева направо. Даже люди, которые ничего не знают о R, могут сказать, что делает вышеприведенное заявление.
-
Поскольку столбцы можно назвать переменными в выражении
select
, я могу сэкономить несколько нажатий клавиш. В моем примере выше, я только должен был набиратьairquality
один раз сsubset
, но три раза с[
.
Таким образом, я жил счастливым, используя subset
повсюду, потому что он короче и читается лучше, даже защищая его красоту среди моих соратников-кодеров. Но вчера мой мир развалился. Читая документацию subset
, я замечаю этот раздел:
Предупреждение
Это функция удобства, предназначенная для интерактивного использования. Для программирования лучше использовать стандартные функции подмножества, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.
Может ли кто-нибудь помочь прояснить, что означают авторы?
Во-первых, что они подразумевают под « для интерактивного использования »? Я знаю, что такое интерактивный сеанс, в отличие от сценария, запускаемого в режиме BATCH, но я не вижу, какую разницу он должен сделать.
Тогда вы могли бы объяснить « нестандартную оценку подмножества аргументов » и почему это опасно, может быть, привести пример?
- Извлечь значения столбца матрицы по имени столбца матрицы
- Как подмножить матрицу в один столбец, сохранить тип данных матрицы, поддерживать имена строк / столбцов?
- Подмножество данных содержит только столбцы, имена которых соответствуют условию
- Подмножество и ggplot2
- Подмножество кадра данных между двумя датами
- R gotcha: логический - и оператор для комбинирования условий - & not &&
- Как заменить NA на подмножество в R (приписывать plyr?)
- Подмножество data.table с использованием переменных с тем же именем, что и в столбце
На этот вопрос ответили хорошо в комментариях @James, указывая на отличное объяснение Хэдли Уикхэма об опасностях subset
(и подобных ему функций) [здесь] . Пойдите, прочитайте это!
Это несколько длинное чтение, поэтому может быть полезно записать здесь пример, который использует Хэдли, который наиболее непосредственно затрагивает вопрос «что может пойти не так?»:
Хэдли предлагает следующий пример: предположим, что мы хотим подмножество, а затем переупорядочить кадр данных, используя следующие функции:
scramble <- function(x) x[sample(nrow(x)), ] subscramble <- function(x, condition) { scramble(subset(x, condition)) } subscramble(mtcars, cyl == 4)
Это возвращает ошибку:
Ошибка в eval (expr, envir, enc): объект 'cyl' не найден
потому что R больше не «знает», где можно найти объект под названием «цил». Он также указывает на действительно причудливые вещи, которые могут произойти, если случайно в глобальной среде есть объект, называемый «цил»:
cyl <- 4 subscramble(mtcars, cyl == 4) cyl <- sample(10, 100, rep = T) subscramble(mtcars, cyl == 4)
(Запустите их и убедитесь сами, это довольно сумасшедший.)
Также [
быстрее:
require(microbenchmark) microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,]) Unit: microseconds expr min lq median uq max neval subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903 100 airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058 100