Поднабор фрейма данных с использованием переменной с тем же именем, что и столбец - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть фрейм данных, и я пытаюсь запустить на нем подмножество.В моем фрейме данных у меня есть столбец с именем «start», и я пытаюсь сделать это:

sub <- subset(data,data$start==14)

, и я правильно получаю подмножество всех строк, где start = 14.

Но, когда я делаю это:

for(start in seq(1,20,by=1)) {
   sub <- subset(data,data$start==start)
   print(sub)
}

, он не может правильно найти подмножества.Он просто печатает весь фрейм данных.

Почему это так и как мне это исправить?

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Вы также можете указать среду, с которой работаете:

x<-data.frame(
  start=sample(3,20,replace=TRUE),
  someValue=runif(20))

env<-environment()
start<-3
cat("\nDefaut scope:")
print(subset(x,start==start)) # all entries, as start==start is evaluated to TRUE

cat("\nSpecific environment:")
print(subset(x,start==get('start',env)))  # second start is replaced by its value in former environment. Equivalent to subset(x,start==3)
1 голос
/ 27 сентября 2011

Исправить это легко. Просто переименуйте ваш for счетчик цикла или столбец фрейма данных во что-то отличное от start.

Причина, по которой это происходит, заключается в том, что subset пытается оценить выражение data$start == start внутри фрейма данных data. Таким образом, он видит столбец start и останавливается там, никогда не видя другой переменной start, которую вы определили в цикле for.

Возможно, лучшее понимание того, почему R запутывается здесь, это заметить, что при использовании subset вам вообще не нужно ссылаться на переменные, используя data$. Итак, представьте себе, говоря R:

subset(data,start == start)

R просто оценит оба этих start внутри data и получит вектор всех TRUE обратно.

0 голосов
/ 27 октября 2011

Другой подход заключается в использовании подмножества скобок, а не функции subset.

for(start in seq(1,20,by=1)) {
   sub <- data[data$start==start,]
   print(sub)
}

subset имеет нестандартные правила оценки, что приводит к проблеме видимости, которую вы видите (к которойstart ты имеешь в виду?).Если есть (или может быть) NA в data$start, вам, вероятно, понадобится

sub <- data[!is.na(data$start) & data$start==start,]

Обратите внимание на это предупреждение со страницы помощи subset:

Это удобная функция, предназначенная для интерактивного использования.Для программирования лучше использовать стандартные функции подмножеств, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...