在R数据帧中循环的行为不符合预期。为什么?
我的目标是逐行循环遍历R数据帧。我知道可以通过索引在循环之外完成,比如如果我想要数据帧df的第1到第5行,我只需要执行df[1:5,],这就为数据帧中的每一列提供了第1:5行。但通常我不知道我想要哪一行,但我想在for循环中逐行循环我的数据帧,这样我就可以应用“if”条件,并将这些行读入列表,并对匹配项进行grepping。我还没有弄清楚问题的每一步,但我想知道为什么这个for循环没有像我预期的那样运行,我希望它会这样 因此,我正在使用内置的R数据集“CO2”。 它看起来是这样的,有84行5列:在R数据帧中循环的行为不符合预期。为什么?,r,R,我的目标是逐行循环遍历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有什么好笑的?这不是你一直在寻找的吗?好吧,我特别要求在不使用子集函数的情况下解决这个问题的其他方法,我知道如何使用子集函数来解决这个问题。是的,它很漂亮。非常感谢。完成。祝贺谢谢