我是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)
}
但在这里,我只获得第一行的正确费率值。
答案 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 )
}
最后一段代码会为您提供正确的输出,但在答案顶部使用矢量化单行代码更容易键入并运行得更快。