R 根据状态计算水平的平均值

R 根据状态计算水平的平均值,r,R,计算平均值我的数据如下所示 ----------- level sts ----------- 10 s ----------- 11 s ----------- 10 s ----------- 10 s ----------- 10 s ----------- 9 r ----------- 8.5

计算平均值我的数据如下所示

    -----------
    level   sts
    -----------
    10      s
    -----------
    11      s
    -----------
    10      s
    -----------
    10      s
    -----------
    10      s
    -----------
    9       r
    -----------
    8.5     r
    -----------
    8       s
    -----------
    8.1     s
    -----------
    8       s
    -----------
    -----------
    level   sts
    -----------
    10.2     s
    -----------
    9        r
    -----------
    8.5      r
    -----------
    8.03     s
    -----------
    -----------
    level   sts
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    9       r
    -----------
    8.5     r
    -----------
    8.03    s
    -----------
    8.03    s
    -----------
    8.03    s
    ---------
根据sts计算平均值(s=停止,r=运行)。我希望输出是这样的

    -----------
    level   sts
    -----------
    10      s
    -----------
    11      s
    -----------
    10      s
    -----------
    10      s
    -----------
    10      s
    -----------
    9       r
    -----------
    8.5     r
    -----------
    8       s
    -----------
    8.1     s
    -----------
    8       s
    -----------
    -----------
    level   sts
    -----------
    10.2     s
    -----------
    9        r
    -----------
    8.5      r
    -----------
    8.03     s
    -----------
    -----------
    level   sts
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    9       r
    -----------
    8.5     r
    -----------
    8.03    s
    -----------
    8.03    s
    -----------
    8.03    s
    ---------
最后,输出将如下所示

    -----------
    level   sts
    -----------
    10      s
    -----------
    11      s
    -----------
    10      s
    -----------
    10      s
    -----------
    10      s
    -----------
    9       r
    -----------
    8.5     r
    -----------
    8       s
    -----------
    8.1     s
    -----------
    8       s
    -----------
    -----------
    level   sts
    -----------
    10.2     s
    -----------
    9        r
    -----------
    8.5      r
    -----------
    8.03     s
    -----------
    -----------
    level   sts
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    10.2    s
    -----------
    9       r
    -----------
    8.5     r
    -----------
    8.03    s
    -----------
    8.03    s
    -----------
    8.03    s
    ---------

如果答案已经可用,请向我提供链接谢谢

基于您所需的输出,我会尝试以下方式:

library(data.table)
setDT(mydf)[, group := rleid(sts)][
  sts == "s", level := mean(level), .(sts, group)][]
#         level sts group
#  1: 10.200000   s     1
#  2: 10.200000   s     1
#  3: 10.200000   s     1
#  4: 10.200000   s     1
#  5: 10.200000   s     1
#  6:  9.000000   r     2
#  7:  8.500000   r     2
#  8:  8.033333   s     3
#  9:  8.033333   s     3
# 10:  8.033333   s     3
library(tidyverse)
library(data.table) # for `rleid`

mydf %>%
  mutate(group = rleid(sts)) %>%
  group_by(sts, group) %>%
  mutate(level = case_when(
    sts == "s" ~ mean(level),
    TRUE ~ level
  ))
我想“tidyverse”的等价物应该是:

library(data.table)
setDT(mydf)[, group := rleid(sts)][
  sts == "s", level := mean(level), .(sts, group)][]
#         level sts group
#  1: 10.200000   s     1
#  2: 10.200000   s     1
#  3: 10.200000   s     1
#  4: 10.200000   s     1
#  5: 10.200000   s     1
#  6:  9.000000   r     2
#  7:  8.500000   r     2
#  8:  8.033333   s     3
#  9:  8.033333   s     3
# 10:  8.033333   s     3
library(tidyverse)
library(data.table) # for `rleid`

mydf %>%
  mutate(group = rleid(sts)) %>%
  group_by(sts, group) %>%
  mutate(level = case_when(
    sts == "s" ~ mean(level),
    TRUE ~ level
  ))

样本数据:

mydf <- structure(list(level = c(10, 11, 10, 10, 10, 9, 8.5, 8, 8.1, 
    8), sts = c("s", "s", "s", "s", "s", "r", "r", "s", "s", "s")),
    .Names = c("level", "sts"), row.names = c(NA, 10L), class = "data.frame")

mydf添加另一个指标变量,然后使用您喜欢的聚合函数。您可以使用
library(data.table);setDT(df1)[,(level=mean(level)),(sts,grp=rleid(sts))]
sts==“r”
为什么不聚合?该行为背后是否有规则?是的,当车辆怠速时,该设备会提供上述信息,因此,当sts为“s”时,考虑用平均值替换水平。当车辆行驶时,燃油油位将降低。@A5C1D2H2I1M1N2O1R2T1