我有一个DataFrame,它描述从1到120的每一秒,以及从0到8的每个nodeId,从一个节点到上一个节点的距离(从nodeId 8到nodeId 7的距离,从7到6) ,...,从1到0)。基本上看起来像这样:
time nodeId distance
1 1 0 0.000000
2 1 1 5.007664
3 1 2 5.001861
4 1 3 5.001778
5 1 4 5.001755
6 1 5 5.001719
7 1 6 5.001714
8 1 7 5.001647
9 1 8 5.001608
289 2 0 0.000000
290 2 1 5.026168
291 2 2 5.007968
292 2 3 5.007372
293 2 4 5.008111
294 2 5 5.009455
我想更改distance列,以便它告诉我每个nodeId和每秒距nodeId 0的距离。
例如,在时间== 1时,nodeId == 2的距离应为nodeId == 2的距离加上nodeId == 1(其中time == 1),然后从那里开始开始将其他值与以前的值相加,例如
(nodeId == 3应该是nodeId == 3 + nodeId == 2)
我尝试过使用for循环,但是我不知道如何在不使用大量if的情况下求和所需的值(基本上每个nodeId-time都使用一个)。
此DataFrame上的结果应如下所示:
time nodeId distance
1 1 0 0.000000
2 1 1 5.007664
3 1 2 10.00953
4 1 3 15.01131
5 1 4 20.01307
6 1 5 25.01479
7 1 6 30.01650
8 1 7 35.01815
9 1 8 40.01976
289 2 0 0.000000
290 2 1 5.026168
291 2 2 10.03414
答案 0 :(得分:5)
我认为您只需要按cumsum
分组的time
。 -
在基数R中-
df$d2 <- with(df, ave(distance, time, FUN = cumsum))
time nodeId distance d2
1 1 0 0.000000 0.000000
2 1 1 5.007664 5.007664
3 1 2 5.001861 10.009525
4 1 3 5.001778 15.011303
5 1 4 5.001755 20.013058
6 1 5 5.001719 25.014777
7 1 6 5.001714 30.016491
8 1 7 5.001647 35.018138
9 1 8 5.001608 40.019746
289 2 0 0.000000 0.000000
290 2 1 5.026168 5.026168
291 2 2 5.007968 10.034136
292 2 3 5.007372 15.041508
293 2 4 5.008111 20.049619
294 2 5 5.009455 25.059074
使用dplyr
-
df %>% group_by(time) %>% mutate(d2 = cumsum(distance)) %>% ungroup()
使用data.table
-
setDT(df)[, d2 := cumsum(distance), by = time][]