使用与列同名的变量对数据框进行子集

时间:2011-09-27 16:20:14

标签: r for-loop scope dataframe subset

我有一个数据框,我正在尝试运行它的子集。在我的数据框中,我有一个名为“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 个答案:

答案 0 :(得分:1)

修复它很容易。只需将for循环计数器或数据框列重命名为start以外的其他内容。

发生这种情况的原因是subset正在尝试评估数据框data$start == start内的表达式data。因此,它会看到列start并停在那里,从未看到您在start循环中定义的其他变量for

或许更好地了解R为什么在这里混淆是要注意,当使用subset时,通常不需要使用data$来引用变量。想象一下R:

subset(data,start == start)

R只是评估startdata的所有内容,并获取所有TRUE的向量。

答案 1 :(得分:1)

您还可以指定您正在使用的环境:

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)

答案 2 :(得分:0)

另一种方法是使用括号子集而不是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帮助页面注意此警告:

  

这是一种便于交互使用的便利功能。对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果。