我有一个数据框,我正在尝试运行它的子集。在我的数据框中,我有一个名为“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)
}
它无法正确找到子集。它只打印整个数据框。
为什么会这样,我该如何解决?
答案 0 :(得分:1)
修复它很容易。只需将for
循环计数器或数据框列重命名为start
以外的其他内容。
发生这种情况的原因是subset
正在尝试评估数据框data$start == start
内的表达式data
。因此,它会看到列start
并停在那里,从未看到您在start
循环中定义的其他变量for
。
或许更好地了解R为什么在这里混淆是要注意,当使用subset
时,通常不需要使用data$
来引用变量。想象一下R:
subset(data,start == start)
R只是评估start
内data
的所有内容,并获取所有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
帮助页面注意此警告:
这是一种便于交互使用的便利功能。对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果。