R 上一组中与另一列在同一位置的平均值
我有一些数据,我将mdo值除以前一个组中mdo实例的计数 我也在计算sog平均值 但是我想计算发生在相同实例上的sog平均值作为结果(mdo/count)值 我期望的结果是:R 上一组中与另一列在同一位置的平均值,r,dplyr,data.table,R,Dplyr,Data.table,我有一些数据,我将mdo值除以前一个组中mdo实例的计数 我也在计算sog平均值 但是我想计算发生在相同实例上的sog平均值作为结果(mdo/count)值 我期望的结果是: grp count mydate mdo sog prev_mdo result sog_avg 1 NA 2019-05-11 1500 12 NA NA NA 1 NA 2019-05-11 1500 1
grp count mydate mdo sog prev_mdo result sog_avg
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 11 NA NA NA
1 NA 2019-05-12 1500 10 NA NA NA
1 NA 2019-05-12 1500 9 NA NA NA
2 NA 2019-05-12 NA 2 1500 NA NA
3 6 2019-05-12 0 8.8 1500 0 0
3 6 2019-05-13 0 8.7 1500 0 0
3 6 2019-05-13 0 7.8 1500 0 0
4 3 2019-05-13 900 11 0 0 0
4 3 2019-05-13 900 11 0 0 0
5 NA 2019-05-14 NA 12 900 NA NA
5 NA 2019-05-14 NA 11 900 NA NA
6 2 2019-05-14 1100 9.54 900 550 11
6 2 2019-05-14 1100 9.8 900 550 11
6 2 2019-05-15 1100 10.4 900 550 11
7 3 2019-05-15 200 4 1100 66.7 9.91
7 3 2019-05-15 200 4 1100 66.7 9.91
7 3 2019-05-15 200 4.5 1100 66.7 9.91
7 3 2019-05-15 200 3.6 1100 66.7 9.91
8 4 2019-05-15 1100 7 200 275 4.03
8 4 2019-05-15 1100 8 200 275 4.03
8 4 2019-05-15 1100 9 200 275 4.03
9 3 2019-05-15 0 0 1100 0 0
结果为零时,sog_平均值应为零,结果为na时,sog平均值应为na
当使用之前的组计数计算结果时,应使用其先前的值计算sog avg
例如:
mdo=1100,结果为550,因为前一个非空组中的计数为2(mdo值900)
1100/2=550。此时,sog平均值应为(11+11)/2=11,因为在前一个非空组中计数为2。这里是一种方法。它广泛使用了使用basetable
或tapply
进行分组的思想,然后将这些结果延迟。注意,如果mdo
在整个组中不是常数,则此答案将失败
库(data.table)
dt=as.data.table(df)
dt[,grp:=rleid(mdo)]
dt[!is.na(mdo),
计数:={
cnt=表(grp)
代表(班次(cnt),cnt)
}
]
setcolorder(dt、c(“grp”、“count”、“mydate”、“mdo”、“sog”))
dt[,,
上一页:{
ord=表(grp)
nafill(代表(轮班(mdo[cumsum(ord)]),ord,“locf”)
}
]
dt[,结果:=fifelse(上一个mdo!=0L,mdo/计数,0)]
dt[!is.na(结果),
sog_平均值:={
mn=tapply(sog、grp、平均值)
代表(班次(mn)、表(grp))
}]
dt[result==0 | is.na(result),sog_avg:=result]
dt
#>grp count mydate mdo sog prev_mdo result sog_avg
#>1:1不适用2019-05-11 1500 12.00不适用
#>2:1不适用2019-05-11 1500 12.00不适用
#>3:1NA 2019-05-111500 12.00 NA
#>4:1不适用2019-05-11 1500 11.00不适用
#>5:1NA 2019-05-121500 10.00 NA
#>6:1NA 2019-05-121500 9.00 NA
#>7:2北美2019-05-12北美2.00 1500北美
#> 8: 3 6 2019-05-12 0 8.80 1500 0.00000 0.000000
#> 9: 3 6 2019-05-13 0 8.70 1500 0.00000 0.000000
#> 10: 3 6 2019-05-13 0 7.80 1500 0.00000 0.000000
#> 11: 4 3 2019-05-13 900 11.00 0 0.00000 0.000000
#> 12: 4 3 2019-05-13 900 11.00 0 0.00000 0.000000
#>13:5北美2019-05-14北美12.00 900北美
#>14:5北美2019-05-14北美11.00 900北美
#> 15: 6 2 2019-05-14 1100 9.54 900 550.00000 11.000000
#> 16: 6 2 2019-05-14 1100 9.80 900 550.00000 11.000000
#> 17: 6 2 2019-05-15 1100 10.40 900 550.00000 11.000000
#> 18: 7 3 2019-05-15 200 4.00 1100 66.66667 9.913333
#> 19: 7 3 2019-05-15 200 4.00 1100 66.66667 9.913333
#> 20: 7 3 2019-05-15 200 4.50 1100 66.66667 9.913333
#> 21: 7 3 2019-05-15 200 3.60 1100 66.66667 9.913333
#> 22: 8 4 2019-05-15 1100 7.00 200 275.00000 4.025000
#> 23: 8 4 2019-05-15 1100 8.00 200 275.00000 4.025000
#> 24: 8 4 2019-05-15 1100 9.00 200 275.00000 4.025000
#> 25: 9 3 2019-05-15 0 0.00 1100 0.00000 0.000000
#>grp count mydate mdo sog prev_mdo result sog_avg
您是否需要变异(sog_avg=ifelse(is.na(result)| result==0,result,sog_avg))?@Ronaksha:嗨,不,我不想要这个。我想像我说的那样正确地计算sog_avg,然后确定,如果结果是nan或零,是的,当您编写滞后(mdo,na.rm=TRUE)
时,您想做什么dplyr::lag
没有名为na.rm=
@Edo:是的,你是对的,但是你可以忽略它。为什么countna
是grp==5
?我认为这没有道理。应该是2。你好,谢谢你的帮助。对于第6组,正确的结果是11,因为它引用了mdo值900,其中sog对于两个条目都是11。发生这种情况是因为第5组有na
mdo值,所以在这种情况下,我们转到前一个非na组(其中mdo不是na)。第4组有mdo 900,两种情况下sog都是11。我希望helpsEven虽然我加载了data.table库,但它一直显示找不到函数nafill和fifelse的错误!你能再安装一次吗?这些是较新的功能,所以您可能有较旧版本的软件包。我安装了1.12.2版,但仍然存在相同的问题。好吧,我发现它需要1.13版,所以我从github安装并运行正常!代码似乎正确!谢谢(upv)
grp count mydate mdo sog prev_mdo result sog_avg
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 11 NA NA NA
1 NA 2019-05-12 1500 10 NA NA NA
1 NA 2019-05-12 1500 9 NA NA NA
2 NA 2019-05-12 NA 2 1500 NA 11
3 6 2019-05-12 0 8.8 1500 0 2
3 6 2019-05-13 0 8.7 1500 0 2
3 6 2019-05-13 0 7.8 1500 0 2
4 3 2019-05-13 900 11 0 0 NA
4 3 2019-05-13 900 11 0 0 NA
5 NA 2019-05-14 NA 12 900 NA 11
5 NA 2019-05-14 NA 11 900 NA 11
6 2 2019-05-14 1100 9.54 900 550 11.5
6 2 2019-05-14 1100 9.8 900 550 11.5
6 2 2019-05-15 1100 10.4 900 550 11.5
7 3 2019-05-15 200 4 1100 66.7 9.91
7 3 2019-05-15 200 4 1100 66.7 9.91
7 3 2019-05-15 200 4.5 1100 66.7 9.91
7 3 2019-05-15 200 3.6 1100 66.7 9.91
8 4 2019-05-15 1100 7 200 275 4.03
8 4 2019-05-15 1100 8 200 275 4.03
8 4 2019-05-15 1100 9 200 275 4.03
9 3 2019-05-15 0 0 1100 0 8
grp count mydate mdo sog prev_mdo result sog_avg
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 12 NA NA NA
1 NA 2019-05-11 1500 11 NA NA NA
1 NA 2019-05-12 1500 10 NA NA NA
1 NA 2019-05-12 1500 9 NA NA NA
2 NA 2019-05-12 NA 2 1500 NA NA
3 6 2019-05-12 0 8.8 1500 0 0
3 6 2019-05-13 0 8.7 1500 0 0
3 6 2019-05-13 0 7.8 1500 0 0
4 3 2019-05-13 900 11 0 0 0
4 3 2019-05-13 900 11 0 0 0
5 NA 2019-05-14 NA 12 900 NA NA
5 NA 2019-05-14 NA 11 900 NA NA
6 2 2019-05-14 1100 9.54 900 550 11
6 2 2019-05-14 1100 9.8 900 550 11
6 2 2019-05-15 1100 10.4 900 550 11
7 3 2019-05-15 200 4 1100 66.7 9.91
7 3 2019-05-15 200 4 1100 66.7 9.91
7 3 2019-05-15 200 4.5 1100 66.7 9.91
7 3 2019-05-15 200 3.6 1100 66.7 9.91
8 4 2019-05-15 1100 7 200 275 4.03
8 4 2019-05-15 1100 8 200 275 4.03
8 4 2019-05-15 1100 9 200 275 4.03
9 3 2019-05-15 0 0 1100 0 0