Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 循环中的子集不一致?_R_For Loop_Subset - Fatal编程技术网

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”,我得到了不同的结果,但仍然不是正确的结果