R - 使用从其他列计算的值创建新的.csv列

时间:2015-07-30 20:22:00

标签: r csv

我有一列值(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.我觉得这很简单,但我还没有能够使它工作!

1 个答案:

答案 0 :(得分:1)

您的代码中有一些内容错误或不好。

  1. 虽然没有禁止,但使用c作为变量名称通常是不好的形式;虽然 R 会理解变量c和基函数c之间的差异(连接),但在阅读代码时会明显混淆。

    事实上,有许多人不喜欢重要变量的单字母变量(有人说任何变量);也许在小循环中使用i是可以接受的,但即便如此,也有人不同意它。

    理由基于代码的共享和维护。如果你在几个月或一年内看一下这些东西,那么你的c中的内容,语义上的含义是什么,会非常清楚吗?

  2. 不要在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)
    }
    
  3. 正如@Molx所说,没有必要循环,在 R 编程时学习和理解是一件重要的事情。分配可以一次完成,因为当你用向量进行数学运算时,对其中的每个值都进行相同的数学运算。所以上面的for循环可以替换为:

    c$co2_new = 0.0
    c$co2_new = c$co2_new + ((c$CO2.Value..PPM. - (-24.395))/1.074)
    
  4. 也许是您示例的工件,但您不需要初始化新列。您可以进一步简化此代码:

    ## no need for c$co2_new = 0.0
    c$co2_new = (c$CO2.Value..PPM. - (-24.395))/1.074