我知道有人过去可能读过这个问题,但再次转发它,因为早些时候的问题不是很清楚。
我有 4 个变量(Id、ASP、RSP、Volume)的数据框,如果 ASP 和 RSP 的连续值之间的绝对差在 +-0.03 之间,我想要的是取交易量的平均值。
例如:在ASP和RSP中,第一个观测值的差异低于0.03,因此对于平均值5109和5707,现在采取下一个观测值(即第三个原因1st和2nd已经使用)ASP=6.39 RSP=6.28现在虽然第4个观测值的差异低于0.03,但我们不能俱乐部交易量,因为它在不同的Id 2202下,所以保持相同,依此类推。
数据:
df1 <- data.frame(Id = c(2201, 2201, 2201, 2202,2202),
ASP= c(6.29, 6.31, 6.39, 6.39,6.36),
RSP= c(6.29,6.28,6.28,6.36,6.36),
Vol= c(5109, 5707, 5999, 5853,6590))
代码:(我不知道如果条件失败,如何取平均音量,所以采取 1 和零 :( )
n=dim(s)[1]
diff_asp_max=s$ASP[1]+0.03
diff_RSP_max=s$RSP[1]+0.03
diff_asp_min=s$ASP[1]-0.03
diff_RSP_min=s$RSP[1]-0.03
for ( i in 1:n)
{
if (s$ASP[i]< diff_asp_max & s$ASP[i]>diff_asp_min & s$RSP[i]>diff_RSP_min & s$RSP[i]< diff_RSP_max & s$diff_StoreId[i]!=1)
{
s$a[i]<- 1
}
else
{
s$a[i]=0
diff_asp_max=s$ASP[i]+0.03
diff_RSP_max=s$RSP[i]+0.03
diff_asp_min=s$ASP[i]-0.03
diff_RSP_min=s$RSP[i]-0.03
}
}
我会这样做,它不会退出您的输出,因为第 2 行仍然存在,在我看来,组 2202 实际上满足您的平均值标准。
ls1 <- split(df1,df1$Id)
ls2 <- lapply(ls1,function(x) {
x$ASP_diff <- c(0,abs(diff(x$ASP)))
x$RSP_diff <- c(0,abs(diff(x$RSP)))
x$MeanVol <- ifelse(x$ASP_diff < 0.03 & x$ASP_diff < 0.03,mean(x[x$ASP_diff < 0.03 & x$ASP_diff < 0.03,"Vol"]),x$Vol)
return(x[,c(1:4,7)])})
unsplit(ls2,df1$Id)