首页 > 解决方案 > 一个接一个地求和行值

问题描述

我有一个 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

我想更改距离列,以便它告诉我从 nodeId 0 到每个 nodeId 的距离,以及每秒的距离。
因此,例如,nodeId==2 on time==1 的距离应该是nodeId==2 的距离加上nodeId==1(其中time==1),然后我需要从那里开始对另一个求和与前面的值相同,例如
(nodeId==3 应该是 nodeId==3+nodeId==2)

我尝试使用 for 循环,但我无法弄清楚如何在不使用大量 if 的情况下对所需的值求和(基本上每个 nodeId 时间一个)。

此 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

标签: rdataframe

解决方案


我认为你只需要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][]

推荐阅读