r - Column by group 中的值之间的差异
问题描述
嗨,我需要实现这样的目标:
grp value diff
1 10 NA # diff[1] = value[2]-value[0] of grp = 1
1 15 10 # diff[2] = value[3]-value[1] of grp = 1
1 20 -5 # diff[3] = value[4]-value[2] of grp = 1
1 10 NA # diff[4] = value[5]-value[3] of grp = 1
2 25 NA # diff[5] = value[6]-value[4] of grp = 2
2 30 10 # diff[6] = value[7]-value[5] of grp = 2
2 35 NA # diff[7] = value[8]-value[6] of grp = 2
我尝试过使用类似的函数shift
,lag
但无法获得这种类型的解决方案,我将前面的值的差异减去它们,它是diff[i] = value[i+1] - value[i-1]
使用for loop
遇到错误,那么有没有更好的方法来做到这一点?
解决方案
我认为您在描述差异值时有错字。但是,如果您希望它diff[i]
成为value[i+1]
- value[i-1]
,您可以同时使用lead
和lag
indplyr
library(dplyr)
df %>% group_by(grp) %>% mutate(diff = lead(value) -lag(value))
# A tibble: 7 x 3
# Groups: grp [2]
grp value diff
<dbl> <dbl> <dbl>
1 1 10 NA
2 1 15 10
3 1 20 -5
4 1 10 NA
5 2 25 NA
6 2 30 10
7 2 35 NA
编辑:绝对差异
如果您需要绝对差异,您可以执行以下操作:
df %>% group_by(grp) %>% mutate(diff = abs(lead(value) -lag(value)))
# A tibble: 7 x 3
# Groups: grp [2]
grp value diff
<dbl> <dbl> <dbl>
1 1 10 NA
2 1 15 10
3 1 20 5
4 1 10 NA
5 2 25 NA
6 2 30 10
7 2 35 NA
它看起来像您要找的东西吗?
数据
df = data.frame(grp = c(rep(1,4),rep(2,3)),
value = c(10,15,20,10,25,30,35))
推荐阅读
- python - 我们如何使用公式将工作表添加到 Excel 工作簿?
- java - 如何在 Apache POI 中设置条件格式规则的优先级?
- javascript - 在 HTML 中创建 Ludo 应用程序 || 无法在用户之间切换机会
- java - Spring Boot WebServiceTemplate 编码问题
- c++ - C++ 函数中的无限循环
- javascript - 我需要在滚动上制作动画
- mongodb - 使用相同的 id 将用户信息存储在多个集合中
- javascript - 我正在制作一个使用 firebase 玩纸牌游戏的网站,并且我正在使用实时数据库,但是当有人抽卡时,它会产生无限循环
- javascript - Bootstrap 4 工具提示自我封闭的悖论
- java - TransactionRequiredException:执行和更新/删除查询