R 循环中的子集不一致?
我每天都使用子集,但最近遇到了一个问题,当我试图在循环中使用索引向量来指定子集条件的子集时。请参见下面的示例,其中因子不能正确地子集 我试图迫使它成为一个因素,也没有运气。我相信这是我这边的问题,不是因为子集有问题。我就是不知道我做错了什么R 循环中的子集不一致?,r,for-loop,subset,R,For Loop,Subset,我每天都使用子集,但最近遇到了一个问题,当我试图在循环中使用索引向量来指定子集条件的子集时。请参见下面的示例,其中因子不能正确地子集 我试图迫使它成为一个因素,也没有运气。我相信这是我这边的问题,不是因为子集有问题。我就是不知道我做错了什么 ##make df df<-data.frame(factor=c("red","green","green","blue"), Numeric=c(1:3,3)) ## subset by numeric Nume
##make df
df<-data.frame(factor=c("red","green","green","blue"), Numeric=c(1:3,3))
## subset by numeric
Numeric<-unique(df$Numeric)
for(i in 1:length(Numeric)){
print(subset(df, Numeric==Numeric[i]))
}
##this works as expected
factor Numeric
1 red 1
factor Numeric
2 green 2
factor Numeric
3 green 3
4 blue 3
## subset by facor
factor<-unique(df$factor)
for(j in 1:length(factor)){
print(subset(df, factor==factor[[j]]))
}
##This runs, but fails, green is subsetted twice and blue is missed
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
2 green 2
3 green 3
##制作df
df我认为这与“因子”这个名字无关。请查看以下实例,其中它按预期成功:
for(j in unique(df$factor) ){
print(subset(df, factor==j))
}
#-----
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
4 blue 3
for(j in factor ){
print(subset(df, factor==j))
}
#------
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
4 blue 3
第一个例子将通过承认的不明智的名称“factor”来消除对外部对象的需要。“帮助”页面的警告显然适用于它在中对循环的使用,毕竟循环是函数。我认为它与“因子”这个名称无关。请查看以下实例,其中它按预期成功:
for(j in unique(df$factor) ){
print(subset(df, factor==j))
}
#-----
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
4 blue 3
for(j in factor ){
print(subset(df, factor==j))
}
#------
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
4 blue 3
第一个例子将通过承认的不明智的名称“factor”来消除对外部对象的需要。“帮助”页面的警告显然适用于它在中的使用,毕竟循环是函数。我认为@42-我可能根本没有很好地沟通,因此为了清楚起见,我在评论中提到的是,只需将第二个示例更改如下:
> f<-unique(df$factor)
> f
[1] red green blue
Levels: blue green red
> for(j in 1:length(f)){
+ print(subset(df, factor==f[j]))
+ }
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
4 blue 3
>f
[1] 红绿蓝
级别:蓝绿红
>对于(1中的j:长度(f)){
+打印(子集(df,因子==f[j]))
+ }
因子数值
1红色1
因子数值
2绿色2
3绿色3
因子数值
4蓝色3
似乎产生了正确的结果,因此我的结论是,子集
发现了错误的因子
,我认为@42-我可能根本没有很好地沟通,因此为了清楚起见,我在评论中提到的是,只需将第二个示例更改如下:
> f<-unique(df$factor)
> f
[1] red green blue
Levels: blue green red
> for(j in 1:length(f)){
+ print(subset(df, factor==f[j]))
+ }
factor Numeric
1 red 1
factor Numeric
2 green 2
3 green 3
factor Numeric
4 blue 3
>f
[1] 红绿蓝
级别:蓝绿红
>对于(1中的j:长度(f)){
+打印(子集(df,因子==f[j]))
+ }
因子数值
1红色1
因子数值
2绿色2
3绿色3
因子数值
4蓝色3
似乎产生了正确的结果,因此我的结论是,子集
发现了错误的因子
子集内的这种表示法(子集内索引)可能不稳定。我个人不知道为什么。我认为您最好使用标准数据帧表示法,对于第一种情况:print(df[df$Numeric==df$Numeric[I],])
其他人可能会解释为什么这是一个错误或有不同的解决方案。想象一下,您只是一台计算机,也就是说,没有人类那么聪明。在你的第二个例子中,想象一下愚蠢的计算机弄清楚每个因子指的是什么是多么令人困惑。有一个同名函数,数据框中有一列同名,还有一个同名的独立向量。太令人困惑了<代码>子集
正在尝试做一些非常复杂的事情,以使您的生活变得简单(解析名称以减少键入),并且您已经竭尽全力使这项工作变得非常困难!;)。。。这是一个很长的说法,使用除因子
以外的名称,不要使用相同的名称两次,甚至更好的是,不要使用子集
,除非在命令行交互工作。在这种情况下,最好使用拆分(df,df$factor)
。subset
和with
的帮助页都有警告,它们只能在函数外部使用。子集内部的这种表示法(在子集内部建立索引)可能不稳定。我个人不知道为什么。我认为您最好使用标准数据帧表示法,对于第一种情况:print(df[df$Numeric==df$Numeric[I],])
其他人可能会解释为什么这是一个错误或有不同的解决方案。想象一下,您只是一台计算机,也就是说,没有人类那么聪明。在你的第二个例子中,想象一下愚蠢的计算机弄清楚每个因子指的是什么是多么令人困惑。有一个同名函数,数据框中有一列同名,还有一个同名的独立向量。太令人困惑了<代码>子集
正在尝试做一些非常复杂的事情,以使您的生活变得简单(解析名称以减少键入),并且您已经竭尽全力使这项工作变得非常困难!;)。。。这是一个很长的说法,使用除因子
以外的名称,不要使用相同的名称两次,甚至更好的是,不要使用子集
,除非在命令行交互工作。在这种情况下,最好使用拆分(df,df$factor)
。subset
和with
的帮助页面都有警告,它们只能在函数外部使用。我的评论部分基于这样一个事实,即当我将向量因子更改为仅为f时,它工作正常。当我将名称因子更改为“non_factor”重新运行代码时,我得到了不同的结果,但仍然不是一个正确的答案:即dfThanks各位,是的,@joran,您是正确的,因为您调用的列的名称和向量的名称不能具有相同的名称,否则结果是错误的。多有趣的虫子啊…谢谢大家的帮助。我发现这个错误有点令人担忧,很容易忽略子集工作不正常,尤其是在大数据集上。@ctlamb请记住,文档明确警告不要使用subset
,除非是作为一个方便的交互函数,并且subset
参数将在数据框中计算,因此,它的行为符合文件规定。我的评论部分基于这样一个事实,即当我将向量因子改为f时,它工作正常。当我重新运行代码时,将名称因子改为“non_factor”,我得到了不同的结果,但仍然不是正确的结果