我有一个包含 3 列的大型数据集,Order、Discharge、Date(数字)。每个订单有 20 年的每日排放值,可以超过 100。
> head(dat)
Order Discharge date
1 0.04712 6574
2 0.05108 6574
3 0.00000 6574
4 0.00000 6574
5 3.54100 6574
6 3.61500 6574
对于给定的订单 x,我想用该日期 x+1 和 x-1 处的出料平均值替换出料值。我一直在使用 for 循环和索引以粗略的方式执行此操作,但处理需要一个多小时。我知道必须有更好的方法。
x <- 4
for(i in min(dat[,3]):max(dat[,3]))
dat[,2][dat[,3] == i & dat[,1] == x ] <-
mean(c(dat[,2][dat[,3] == i & dat[,1] == x + 1],
dat[,2][dat[,3] == i & dat[,1] == x - 1]))
给
> head(dat)
Order Discharge date
1 0.04712 6574
2 0.05108 6574
3 0.00000 6574
4 1.77050 6574
5 3.54100 6574
6 3.61500 6574
如果第 4 号订单的出院,日期 6574 已替换为 1.77050。它有效,但速度非常慢。
我应该指定我不需要对每个订单进行此计算,而只需选择少数几个(总共 117 个订单中只有 8 个)。根据答案,我有以下内容。
dat$NewDischarge <- by(dat$Discharge,dat$date,function(x)
colMeans(cbind(c(x[-1],NA), x,
c(NA, x[-length(x)])), na.rm=T))
我试图找出一种方法,仍然只计算要计算的选择订单的值,并且陷入 for 循环和日期和订单索引的常规。