R 上一组中与另一列在同一位置的平均值

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

我有一些数据,我将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    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。

这里是一种方法。它广泛使用了使用base
table
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:是的,你是对的,但是你可以忽略它。为什么count
na
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