我有一列值(CO2.Value..PPM),并且想要创建一个新列(co2_new),它是从第一列获取每个值并对其进行缩放的结果。这就是我的尝试:
c$co2_new = 0.0
for (i in c$co2_new){
i = i + ((c$CO2.Value..PPM.-(-24.395))/1.074)
return i
}
head(c$co2_new)
但是它返回一个错误(意外的符号)并且该列仍然只包含0.我觉得这很简单,但我还没有能够使它工作!
答案 0 :(得分:1)
您的代码中有一些内容错误或不好。
虽然没有禁止,但使用c
作为变量名称通常是不好的形式;虽然 R 会理解变量c
和基函数c
之间的差异(连接),但在阅读代码时会明显混淆。
事实上,有许多人不喜欢重要变量的单字母变量(有人说任何变量);也许在小循环中使用i
是可以接受的,但即便如此,也有人不同意它。
理由基于代码的共享和维护。如果你在几个月或一年内看一下这些东西,那么你的c
中的内容,语义上的含义是什么,会非常清楚吗?
不要在return
循环中使用for
,除非它在函数内并且您打算打破for
循环和函数。具体而言,您在for
循环中的预期操作是从$CO2.Value..PPM
中的某个特定位置获取值,对其进行缩放,然后将该值分配到$co2_new
中的相同位置。在这种情况下,您的for
循环变量应该是向量中的索引,而不是值本身,以便您可以引用两个向量中的位置。也许(这不是很好的代码,基于我的下面的数字3):
c$co2_new = 0.0
for (i in 1:length(c$co2_new)) {
c$co2_new[i] = c$co2_new[i] + ((c$CO2.Value..PPM.[i] -(-24.395))/1.074)
}
正如@Molx所说,没有必要循环,在 R 编程时学习和理解是一件重要的事情。分配可以一次完成,因为当你用向量进行数学运算时,对其中的每个值都进行相同的数学运算。所以上面的for
循环可以替换为:
c$co2_new = 0.0
c$co2_new = c$co2_new + ((c$CO2.Value..PPM. - (-24.395))/1.074)
也许是您示例的工件,但您不需要初始化新列。您可以进一步简化此代码:
## no need for c$co2_new = 0.0
c$co2_new = (c$CO2.Value..PPM. - (-24.395))/1.074