r - 一个接一个地求和行值
问题描述
我有一个 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
解决方案
我认为你只需要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][]
推荐阅读
- wpf - 强制两个 WPF 控件具有相同的宽度,同时保持来自 xaml 的自动调整大小(两个控件的宽度都大于两个)
- javascript - 使用基于嵌套值的数组过滤对象数组以提取特定字段
- android - 我可以添加一个允许通知权限而不是打开应用程序设置的按钮吗?(颤振,iOS/Android)
- excel - 有没有办法限制查看工作簿中特定工作表的 VBA 代码?
- python - Django 如何从模板中的另一个查询集中获取查询集
- apache-spark - pyspark 数据框到 rdd 只取值
- html - 离子页脚在 iphoneX 中显示一半
- python - 熊猫将列添加在一起
- java - Esper V8.5如何指定ThreadingService的setRejectedExecutionHandler、prestartAllCoreThreads、allowCoreThreadTimeOut
- amazon-web-services - EC2 实例在浏览器中工作约 30 分钟,然后停止约 10 分钟