2014-05-21 80 views
0

我的新R.我有一个数据帧的输入,其包括如何在数据帧计算中的R特定列值

 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

你的逻辑有一个错误。您不要索引列。 – bdecaf

回答

0

这实际上是

INPUT$rate <- INPUT$sulfate/(nrow(INPUT) + 1 - 1:nrow(INPUT)) 

一样简单,不需要使用一个for循环由于R操作都矢量化。


如果你真的想还是用一个for循环(和它真的不需要),那么你就需要修复你的代码的几个问题。

​​实际上创建了一个向量让我迭代,所以没有必要使用1:seq_len(),这是多余的,会给你一个警告信息。我只想用1:x成语,而忘记了​​现在

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) 
} 

代码的最后一块会给你正确的输出,但使用矢量化一个班轮在回答的顶部都更容易输入和运行速度更快。

+0

我已经包含循环,因为我需要计算每个硫酸盐值的每个速率值。 – user3659532

+0

@ user3659532我给你的代码存在一个问题,但现在我已经修复了它,这正是它所做的。尝试一下!让我知道你是否需要更多的解释。 – MattLBeck

+0

我需要速率值,因为我的第一个速率值应该是2.3 /(总行数+ 1 - 第一行数,即1)。同样,我想计算二分之一的价值为2.19 /(行总数+ 1 - 第二行数,即2)。 (2.3是我的第一个硫酸盐值,2.19是我的第二个硫酸盐值) – user3659532

相关问题