Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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 - Fatal编程技术网

在R数据帧中循环的行为不符合预期。为什么?

在R数据帧中循环的行为不符合预期。为什么?,r,R,我的目标是逐行循环遍历R数据帧。我知道可以通过索引在循环之外完成,比如如果我想要数据帧df的第1到第5行,我只需要执行df[1:5,],这就为数据帧中的每一列提供了第1:5行。但通常我不知道我想要哪一行,但我想在for循环中逐行循环我的数据帧,这样我就可以应用“if”条件,并将这些行读入列表,并对匹配项进行grepping。我还没有弄清楚问题的每一步,但我想知道为什么这个for循环没有像我预期的那样运行,我希望它会这样 因此,我正在使用内置的R数据集“CO2”。 它看起来是这样的,有84行5列:

我的目标是逐行循环遍历R数据帧。我知道可以通过索引在循环之外完成,比如如果我想要数据帧df的第1到第5行,我只需要执行df[1:5,],这就为数据帧中的每一列提供了第1:5行。但通常我不知道我想要哪一行,但我想在for循环中逐行循环我的数据帧,这样我就可以应用“if”条件,并将这些行读入列表,并对匹配项进行grepping。我还没有弄清楚问题的每一步,但我想知道为什么这个for循环没有像我预期的那样运行,我希望它会这样

因此,我正在使用内置的R数据集“CO2”。 它看起来是这样的,有84行5列:

> CO2[1:10,]
   Plant   Type  Treatment conc uptake
1    Qn1 Quebec nonchilled   95   16.0
2    Qn1 Quebec nonchilled  175   30.4
3    Qn1 Quebec nonchilled  250   34.8
4    Qn1 Quebec nonchilled  350   37.2
5    Qn1 Quebec nonchilled  500   35.3
6    Qn1 Quebec nonchilled  675   39.2
7    Qn1 Quebec nonchilled 1000   39.7
8    Qn2 Quebec nonchilled   95   13.6
9    Qn2 Quebec nonchilled  175   27.3
10   Qn2 Quebec nonchilled  250   37.1
这就是我到目前为止所取得的成就

   for(i in 1:nrow(CO2)) # "i" is incrementer from 1 to 84.
    {
        r <- CO2[i,] # r is our current row. 
        if(r$conc == 95 & r$Treatment == "nonchilled"){print(r)} 

    }
那很酷。但是,我不希望它复制头,那么如何修改代码以在for循环中生成此结果而不使用subset函数呢?因此,我希望输出如下所示:

 Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
8    Qn2      Quebec nonchilled   95   13.6
15   Qn3      Quebec nonchilled   95   16.2
43   Mn1 Mississippi nonchilled   95   10.6
50   Mn2 Mississippi nonchilled   95   12.0
57   Mn3 Mississippi nonchilled   95   11.3
正如您所见,标题只出现一次。是的,subset函数很强大,但它有点让我无法逐行迭代数据帧

此外,我发现有趣的是,我的for循环给了我行数,其中浓度都是95,同时处理是“非Chilled”。那么,我怎样才能在for循环中隔离这些呢

嘿,我想起来了。我意识到R将变量“R”解释为一个包含所有列和一行的数据帧。因此,如果使用if条件,我从“r”中删除列名,我得到的结果看起来很好,有行号,但不幸的是没有标题

for(i in 1:nrow(CO2)) # "i" is incrementer from 1 to 84.
{
    r <- CO2[i,] # r is our current row. 
    if(r$conc == 95 & r$Treatment == "nonchilled"){
        names(r) = NULL; # Removes headers. # It's important to do it here specifically.
        print(r)} 
}

这是一个工作代码。但是标题没有对齐

df <- mtcars
print(paste(colnames(df)))
for (i in seq(1,10)){
    r <- paste(df[i,])  
  print(r)
} 

df这是一个工作代码。但是标题没有对齐

df <- mtcars
print(paste(colnames(df)))
for (i in seq(1,10)){
    r <- paste(df[i,])  
  print(r)
} 

df这对您有用吗:

df<-data.frame(Plant=character(0), Type=character(0), 
                Treatment=character(0), conc=numeric(0), 
                uptake=numeric(0))

for(i in 1:nrow(CO2)){if(CO2$conc[i]==95 & CO2$Treatment[i]=="nonchilled"){
df<-rbind(df,CO2[i,])}}
> df
#    Plant        Type  Treatment conc uptake
#1    Qn1      Quebec nonchilled   95   16.0
#8    Qn2      Quebec nonchilled   95   13.6
#15   Qn3      Quebec nonchilled   95   16.2
#43   Mn1 Mississippi nonchilled   95   10.6
#50   Mn2 Mississippi nonchilled   95   12.0
#57   Mn3 Mississippi nonchilled   95   11.3

df这对您有用吗:

df<-data.frame(Plant=character(0), Type=character(0), 
                Treatment=character(0), conc=numeric(0), 
                uptake=numeric(0))

for(i in 1:nrow(CO2)){if(CO2$conc[i]==95 & CO2$Treatment[i]=="nonchilled"){
df<-rbind(df,CO2[i,])}}
> df
#    Plant        Type  Treatment conc uptake
#1    Qn1      Quebec nonchilled   95   16.0
#8    Qn2      Quebec nonchilled   95   13.6
#15   Qn3      Quebec nonchilled   95   16.2
#43   Mn1 Mississippi nonchilled   95   10.6
#50   Mn2 Mississippi nonchilled   95   12.0
#57   Mn3 Mississippi nonchilled   95   11.3


df您正在使用的
print
。你真的需要为
循环设置一个
吗?我只是想找出解决问题的替代方法,像在其他语言中那样更经典地处理数据帧。这是一个基本的例子,所以我希望从中学习一些东西,以便将来可以将其应用于更高级别的问题。您正在使用
print
。你真的需要为
循环设置一个
吗?我只是想找出解决问题的替代方法,像在其他语言中那样更经典地处理数据帧。这是一个基本的例子,所以我希望从中学习一些东西,这样我就可以在将来把它应用到更高层次的问题上。谢谢。在没有经典for循环的情况下,R确实有很多解决问题的方法,这几乎使R无法有效地用于R中的循环,因为没有多少R用户使用过for循环,而是通常使用R-base包装函数。所以我认为R代码带有for循环和while循环几乎不可能找到,这是一个遗憾,即使R可以做到这些。我不认为这是一个遗憾!!我相信即使你很快也会开始使用其他选项,因为1)它们速度更快2)可读性更强,书写更简洁。不管怎样,我的解决方案给你提供了答案吗?事实上,它并不像我想象的那样。它生成这样的输出,不包括行号,我不确定[1]和[7]在这里的意思。[1] “21”“6”“160”“110”“3.9”“2.62”[7]“16.46”“0”“1”“4”“4”[1]“21”“6”“160”“110”“3.9”“2.875”[7]“17.02”“0”“1”“4”“4”[1]“22.8”“4”“108”“93”“3.85”“2.32”[7]“18.61”“1”“1”“4”“1”,即使您无法获取行号,我很高兴你没有像我一样复制标题。很好,谢谢。在没有经典for循环的情况下,R确实有很多解决问题的方法,这几乎使R无法有效地用于R中的循环,因为没有多少R用户使用过for循环,而是通常使用R-base包装函数。所以我认为R代码带有for循环和while循环几乎不可能找到,这是一个遗憾,即使R可以做到这些。我不认为这是一个遗憾!!我相信即使你很快也会开始使用其他选项,因为1)它们速度更快2)可读性更强,书写更简洁。不管怎样,我的解决方案给你提供了答案吗?事实上,它并不像我想象的那样。它生成这样的输出,不包括行号,我不确定[1]和[7]在这里的意思。[1] “21”“6”“160”“110”“3.9”“2.62”[7]“16.46”“0”“1”“4”“4”[1]“21”“6”“160”“110”“3.9”“2.875”[7]“17.02”“0”“1”“4”“4”[1]“22.8”“4”“108”“93”“3.85”“2.32”[7]“18.61”“1”“1”“4”“1”,即使您无法获取行号,我很高兴你没有像我一样复制标题。很好。@xyz123有什么好笑的?这不是你一直在寻找的吗?好吧,我特别要求在不使用子集函数的情况下解决这个问题的其他方法,我知道如何使用子集函数来解决这个问题。是的,它很漂亮。非常感谢。完成。祝贺谢谢。@xyz123有什么好笑的?这不是你一直在寻找的吗?好吧,我特别要求在不使用子集函数的情况下解决这个问题的其他方法,我知道如何使用子集函数来解决这个问题。是的,它很漂亮。非常感谢。完成。祝贺谢谢