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