嗨,我需要实现以下目标:
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[3] 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
和dplyr
来实现。
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
它看起来像您要找的东西吗?
我们可以做
library(dplyr)
df1 %>%
group_by(grp)
mutate(diff = lag(abs(lead(value, 2) - value)))
# A tibble: 7 x 3
# Groups: grp [2]
# grp value diff
# <int> <int> <int>
#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