Когда мне нужно отфильтровать data.frame, т.е. извлечь строки, которые удовлетворяют определенным условиям, я предпочитаю использовать subset
функцию:
subset(airquality, Month == 8 & Temp > 90)
Вместо [
функции:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Есть две основные причины моего предпочтения:
Я считаю, что код читается лучше, слева направо. Даже люди, которые ничего не знают о R, могут сказать, что
subset
делает приведенное выше утверждение.Поскольку в
select
выражении столбцы могут называться переменными , я могу сохранить несколько нажатий клавиш. В приведенном выше примере мне нужно было набратьairquality
только один разsubset
, но три раза[
.
Так что я жил счастливым, использовал subset
везде, потому что он короче и лучше читается, даже отстаивая его красоту среди моих коллег-программистов. Но вчера мой мир распался. Читая subset
документацию, я замечаю этот раздел:
Предупреждение
Это удобная функция, предназначенная для интерактивного использования. Для программирования лучше использовать стандартные функции подмножеств, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.
Может ли кто-нибудь помочь уточнить, что авторы имеют в виду?
Во-первых, что они подразумевают под « для интерактивного использования »? Я знаю, что такое интерактивный сеанс, в отличие от сценария, запускаемого в режиме BATCH, но я не понимаю, какое это должно иметь значение.
Тогда, не могли бы вы объяснить « нестандартную оценку подмножества аргументов » и почему это опасно, может быть, привести пример?
dplyr::filter
есть такая же проблема. Т.е. если в среде есть переменная с таким именем, она будет использовать ее вместо переменной во фрейме данных. Делает для запутанной отладки!
with(airquality, airquality[Month == 8 & Temp > 90, ])