R 如何计算每个组的月日期决定的变量和滞后之间的差异?

R 如何计算每个组的月日期决定的变量和滞后之间的差异?,r,dataframe,dplyr,R,Dataframe,Dplyr,本质上,我有一个数据集,其中的变量表示变量的组、日期和值。我需要取每个组的值和上年末值之间的差值。由于数据是平衡的,所以我尝试使用dplyr::lag,插入观察月份的滞后: x <- x %>% group_by(g) %>% mutate(y = v - lag(v, n=month(d)) 通过dplyr可以查找最后一天,获取索引并使用该索引进行减法,然后转换为NAs,即 library(dplyr) x %>% group_by(g) %>% mu

本质上,我有一个数据集,其中的变量表示变量的组、日期和值。我需要取每个组的值和上年末值之间的差值。由于数据是平衡的,所以我尝试使用
dplyr::lag
,插入观察月份的滞后:

x <- x %>% group_by(g) %>% mutate(y = v - lag(v, n=month(d))

通过
dplyr
可以查找最后一天,获取索引并使用该索引进行减法,然后转换为NAs,即

library(dplyr)

x %>% 
 group_by(g) %>% 
 mutate(new = which(sub('^[0-9]+-([0-9]+-[0-9]+)$', '\\1', d) == '12-31'), 
        y = v - v[new], 
        y = replace(y, row_number() <= new, NA)) %>% 
 select(-new)
库(dplyr)
x%>%
按(g)%>%
变异(新=其中(sub(“^[0-9]+-([0-9]+-[0-9]+)$”,“\\1',d)==“12-31”),
y=v-v[新],
y=替换(y,行号()%
选择(-new)
这就给了,

#一个tible:7 x 4
#组别:g[3]
g d v y
1b 2018-11-30 300北美
2 B 2018-12-31 200北美
3B 2019-01-31250 50
4 C 2017-12-31 400北美
5 A 2018-12-31 500北美
6a 2019-01-31400-100
7 A 2019-02-28 500 0

最后,我决定创建一个辅助变量(“eoy”)来表示每组对应年末的行。它需要一个循环,效率很低,但有利于依赖于此的剩余计算。所需的计算将成为:


mutate('y'=x-x[eoy])

在模拟数据集中,只有1个组:A,有2年:2018和2019年,那么2018-12-31将是每个组上一年的唯一结尾。我假设每个组没有连续3年(否则每个组将有2个上一年的结尾)。然后你可以1)提取日期的
year组件-1
以获取上一年,2)使用
max()
获取年末。抱歉,我将使模拟数据集更全面。事实上,这就是我的目标。然而,在dplyr管道中,如何计算同一组的值(年=年1,最大月数)?换句话说,创建一个y=x-x[year==year-1&month=max(当年的月份)]?我恐怕无法获得所需变量的值(NA,NA,-50,NA,500,100,0)。如果输入是数据帧('g'=c('B','B','B','c','A','A','A','A','d'=c('2018-11-30','2018-12-31','2019-01-31','2017-12-31','2018-12-31','2019-01-31','2019-02-28'),'v'=c(300200250400500400500)),那么我的预期输出y是:(NA,NA,NA,50,NA,NA,-100,0)。事实上,我错了(在后一个阶段中,我不希望在年底检索NAs,而是检索值本身,尽管这可以通过ifelse子句轻松完成)。它不起作用,因为我的数据集每个组有超过两年的时间。我如何调整分析,使其查找具有year=year-1和'12-31'的值,如此方法中所示?我不熟悉常规表达式这是一个重要的细节需要忽略。请更新您的数据集和问题中的预期输出您的approach正是我想要的,但我希望新引用%y-1+“-12-31”将其添加到数据集中
y <- c(NA,NA,-50,NA,NA,-250,-200,300,-100,0)
cbind(x,y)
library(dplyr)

x %>% 
 group_by(g) %>% 
 mutate(new = which(sub('^[0-9]+-([0-9]+-[0-9]+)$', '\\1', d) == '12-31'), 
        y = v - v[new], 
        y = replace(y, row_number() <= new, NA)) %>% 
 select(-new)
# A tibble: 7 x 4
# Groups:   g [3]
  g     d              v     y
  <fct> <fct>      <dbl> <dbl>
1 B     2018-11-30   300    NA
2 B     2018-12-31   200    NA
3 B     2019-01-31   250    50
4 C     2017-12-31   400    NA
5 A     2018-12-31   500    NA
6 A     2019-01-31   400  -100
7 A     2019-02-28   500     0