R-最近观测日期的n次观测的平均值

R-最近观测日期的n次观测的平均值,r,data-analysis,moving-average,R,Data Analysis,Moving Average,我有一个数据框,ID为个人、观察日期和度量。看起来是这样的: ID Date Metric a Day 1 9 a Day 2 8 a Day 3 9 a Day 4 8 a Day 5 7 a Day 6 6 a Day 7 5 a Day 8 4 a Day 9 3 a Day 10 3 b Day 1 6 b Day 2 7 b Day

我有一个数据框,ID为个人、观察日期和度量。看起来是这样的:

ID  Date    Metric
a   Day 1     9
a   Day 2     8
a   Day 3     9
a   Day 4     8
a   Day 5     7
a   Day 6     6
a   Day 7     5
a   Day 8     4
a   Day 9     3
a   Day 10    3
b   Day 1     6
b   Day 2     7
b   Day 3     6
b   Day 4     7
b   Day 5     8
b   Day 6     9
b   Day 7     9
b   Day 8     9
ID  lastDate    metric_avg  prev2   prev3   prev4   prev5   
a   Day 10      6.2          3.5     4       4.5      5 
b   Day 8       7.63           9    8.67    8.25    7.8 
我想将其压缩为ID上的一行,并添加变量(prev2、prev3、prev4、prev5),用于计算自最近观测日期以来n次观测的平均值(但不包括平均值中的lastdate)。例如,“prev2”是最近2次观察的平均值,“prev3”是最近3次观察的平均值。因此ID A的prev2是第8天和第9天的平均值(3.5)。ID B的prev3是第5、6、7天的平均值(8.67)。最终回顾最近/最大日期,并平均一系列观察结果

它应该是这样的:

ID  Date    Metric
a   Day 1     9
a   Day 2     8
a   Day 3     9
a   Day 4     8
a   Day 5     7
a   Day 6     6
a   Day 7     5
a   Day 8     4
a   Day 9     3
a   Day 10    3
b   Day 1     6
b   Day 2     7
b   Day 3     6
b   Day 4     7
b   Day 5     8
b   Day 6     9
b   Day 7     9
b   Day 8     9
ID  lastDate    metric_avg  prev2   prev3   prev4   prev5   
a   Day 10      6.2          3.5     4       4.5      5 
b   Day 8       7.63           9    8.67    8.25    7.8 
我试图创建预测变量来分析我公司的人员流失情况。人们认为,在离职后1个月或2个月,约翰尼的绩效指标会发生变化,可以预测吉米是否会在不久的将来离职

任何关于如何分析这些数据的建议或想法都是非常棒的

谢谢

“lappy”可能有用:

ID <- unique(data$ID)

rowNr <- lapply(ID,function(id){which(data$ID==id)})

lastDate  <- lapply(rowNr,function(n){data$Date[rev(n)[1]]})
metricAvg <- lapply(rowNr,function(n){mean(data$Metric[n])})
prev2     <- lapply(rowNr,function(n){mean(data$Metric[head(tail(c(NA,n),3),2)])})
prev3     <- lapply(rowNr,function(n){mean(data$Metric[head(tail(c(NA,n),4),3)])})
prev4     <- lapply(rowNr,function(n){mean(data$Metric[head(tail(c(NA,n),5),4)])})
prev5     <- lapply(rowNr,function(n){mean(data$Metric[head(tail(c(NA,n),6),5)])})



output <- data.frame( ID         = ID,
                      last_Date  = unlist(lastDate),
                      metric_Avg = unlist(metricAvg),
                      prev2      = unlist(prev2),
                      prev3      = unlist(prev3),
                      prev4      = unlist(prev4),
                      prev5      = unlist(prev5)  )
另一个例子显示了如果没有足够的天数来计算“prev5”、“prev4”和…,会发生什么情况:

输出:

> output
  ID last_Date metric_Avg prev2    prev3 prev4 prev5
1  a    Day 10      6.200   3.5 4.000000  4.50   5.0
2  b     Day 8      7.625   9.0 8.666667  8.25   7.8
> output
  ID last_Date metric_Avg prev2    prev3 prev4 prev5
1  a    Day 10      6.200   3.5 4.000000  4.50   5.0
2  b     Day 8      7.625   9.0 8.666667  8.25   7.8
3  c    Day 13      4.000   2.0       NA    NA    NA
4  d     Day 8     10.000    NA       NA    NA    NA
> 
这种轻型base R解决方案甚至比其收费过高的竞争对手更快:

> system.time(
+   for ( i in 1:5000)
+   {
+     ID <- unique(data$ID)
+      .... [TRUNCATED] 
   user  system elapsed 
  28.28    0.01   28.47 

> #-----------------------------------------------------------------
> 
> library(tidyr); library(dplyr); library(magrittr)

> system.time(
+   for ( i in 1:5000)
+   {
+     df <-data
+     
+     df %<>% separate(Date, into=c("d1", "d2")) %>% 
+       arrange(ID, as.numeri .... [TRUNCATED] 
   user  system elapsed 
  46.56    0.05   46.87 
> 
>system.time(
+对于(1:5000中的i)
+   {
+身份证#-----------------------------------------------------------------
> 
>图书馆(tidyr);图书馆(dplyr);图书馆(magrittr)
>系统时间(
+对于(1:5000中的i)
+   {
+df%
+排列(ID,as.numeri…[截断]
用户系统运行时间
46.56    0.05   46.87 
> 

我会使用
dplyr
tidyr
magrittr
来处理它

数据

备注

如果您的
Date
列有日期,则使用
lubridate
包。代码的前几行是:

df$Date <- ymd(df$Date) # id the Date is of the form yyyy-mm-dd or yyyy/mm/dd

df %<>% arrange(ID, Date) %>% group_by(ID) %>% mutate(last_Date= max(Date)...
df$Date%group\u by(ID)%%>%mutate(last\u Date=max(Date)。。。

我花了一分钟的时间才弄明白你的意思,但我想我现在明白了;如果你有第6天,在那之前的最近一个日期是第1天,像prev2这样的东西是否有值,或者只是因为缺少第4天和第5天(那将是第6天之前的2天)而变为NA?如果有第6天,新创建的prev2变量将是第4天和第5天的平均值…如果只有4天的观察值,并且我们试图找到prev4,结果将是NA。我有意义吗?我还编辑了原始问题以添加澄清。-谢谢!我修改了我的答案,以便在出现问题时显示所需的NA你没有足够的时间。
  ID     last_Date   metric_Avg   prev2    prev3    prev4   prev5
1  a     Day 10      6.200        3.5      4.000    4.50    5.0
2  b     Day 8       7.625        9.0      8.667    8.25    7.8
3  c     Day 13      4.000        2.0      NA       NA      NA
4  d     Day 8       10.000       NA       NA       NA      NA
df$Date <- ymd(df$Date) # id the Date is of the form yyyy-mm-dd or yyyy/mm/dd

df %<>% arrange(ID, Date) %>% group_by(ID) %>% mutate(last_Date= max(Date)...