R-最近观测日期的n次观测的平均值
我有一个数据框,ID为个人、观察日期和度量。看起来是这样的: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 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)...