2012-05-30 3 views
3

я наткнулся запутанной «особенность» функция подмножества (используя имя столбца в качестве имени вектора для Подменят не работает):Почему подмножество не работает с именем вектора, идентичным имени столбца?

data(iris) 
Species <- unique(iris$Species) 
i <- 2 
Species[i] 
subset(iris, subset = Species == Species[i]) 

sp <- unique(iris$Species) 
sp[i] 
subset(iris, subset = Species == sp[i]) 

Может кто-нибудь объяснить мне, что здесь происходит, и почему?

ответ

9

subset() сначала заглянет в рамки данных для любого объекта, который вы упомянули, поэтому в вашем первом примере Species[i] возвращает «setosa» (то же, что и iris$Species[i]). Только когда объект, указанный вами, не может быть найден внутри фрейма данных, R будет выглядеть в родительских кадрах и найдет там правильный объект.

Так что все работает, вы просто не понимаете, как это работает. Вы могли бы прочитать в файлах справки:

Обратите внимание, что подмножество будет оцениваться в кадре данных, так что столбцы могут называться (по имени) в качестве переменных в выражении (см примеры).

Как это происходит?

Причина заключается в том, что следующие строки кода в subset():

e <- substitute(subset) 
r <- eval(e, x, parent.frame()) 
  • subset (или e) находится в вашем примере Species == Species[i]
  • x находится в вашем примере iris
  • parent.frame() возвращается в ваш пример глобальной среды.

Второй аргумент вызова eval, x называется envir. Это среда (или список или кадр данных, ...), где выражение оценивается. В вашем случае R оценивает Species == Species[i]внутриx, который является вашим фреймом данных.

Третий аргумент, parent.frame(), является корпусом. Это среда, в которой содержится кадр данных, который вы указали в среде als, и это место, где R будет выглядеть в случае, если переменные не найдены в фрейме данных.

См. Также? eval

 Смежные вопросы

  • Нет связанных вопросов^_^