如何计算R中数据框中的特定列值

时间:2014-05-21 07:07:27

标签: r

我是R.的新手。我有一个包含

的数据框INPUT
       Date        sulfate
 1   01-05-2014   2.3
 2   02-05-2014   2.19
 3   03-05-2014   1.2
 4   04-05-2014   2.23
 5   05-05-2014   4.15
 6   06-05-2014   3
 7   07-05-2014   4.04
 8   08-05-2014   4.79
 9   09-05-2014   2.05
 10  10-05-2014   7.93
 11  11-05-2014   7.74
 12  12-05-2014   2.63
 13  13-05-2014   3.8
 14  14-05-2014   3.52
 15  15-05-2014   3.7

我必须再增加一列"率"使得每个速率值等于该行的每个硫酸盐值除以(总行数+1-每个行数)。我的代码如下:

for(i in 1:seq_len(nrow(INPUT))) {
       INPUT["rate"] <- NA
       INPUT$rate <- INPUT$sulfate / (seq_len(nrow(INPUT)) +1 -i)
   }

但在这里,我只获得第一行的正确费率值。

1 个答案:

答案 0 :(得分:0)

这实际上就像

一样简单
INPUT$rate <- INPUT$sulfate/( nrow(INPUT) + 1 - 1:nrow(INPUT) )

不需要使用for循环,因为R操作都是矢量化的。


如果您真的想继续使用for循环(并且它确实不需要),那么您需要修复代码中的几个问题。

seq_len实际上为i迭代创建了一个向量,因此不需要使用1:seq_len(),这是多余的,会给你一个警告信息。我只想使用1:x成语,暂时忘记seq_len

for(i in 1:nrow(INPUT)){ ... }

您还需要在for循环中索​​引列,如@bdecaf所述。例如,以下内容会为列rate指定与sulfate

相同的值
for(i in 1:nrow(INPUT)) {
   INPUT$rate[[i]] <- INPUT$sulfate[[i]]
}

最后,每次迭代都会调用INPUT["rate"] <- NA行,基本上是擦除之前存储在rate列中的赋值。如果您尝试使用NA s初始化列,则需要在循环之前执行此操作,例如

INPUT$rate <- NA
for(i in 1:nrow(INPUT)) {
    INPUT$rate[[i]] <- INPUT$sulfate[[i]] / ( nrow( INPUT ) + 1 - i )
}

最后一段代码会为您提供正确的输出,但在答案顶部使用矢量化单行代码更容易键入并运行得更快。