我有一个带有变量 RATE 的数据框,每隔几行就有一个 NA 值:
ID RATE
1 10
1 15
1 8
1 6
1 NA
1 10
1 20
1 NA
1 14
1 2
2 8
2 6
2 NA
在这些行上,我想添加一个变量mean_RATE和sd_RATE,对应于NA行之间所有行的平均值和sd。此平均值和标准差仅针对具有相同 ID 的所有费率进行计算:
ID RATE mean_RATE sd_RATE
1 10
1 15
1 8
1 6
1 NA 9.75 3.86221
1 10
1 20
1 NA 15 7.071068
1 14
1 2
2 8
2 6
2 NA 7 1.414214
正如您在上面所需的输出中所看到的,在任何平均值或标准差计算中都不会考虑与 RATE 14 和 2 对应的行,因为下一个 NA 行具有不同的 ID。
有人可以帮助我找到一种有效的方法吗?
最佳答案
我们可以使用tidyverse
来做到这一点
library(dplyr)
df %>%
group_by(ID, grp = cumsum(lag(is.na(RATE), default = FALSE))) %>%
mutate(mean_RATE = mean(RATE, na.rm = TRUE), sd_RATE = sd(RATE, na.rm = TRUE)) %>%
mutate_at(vars(matches("_RATE")), funs(replace(., !is.na(RATE), NA)))
# A tibble: 13 x 5
# Groups: ID, grp [4]
# ID RATE grp mean_RATE sd_RATE
# <int> <int> <int> <dbl> <dbl>
# 1 1 10 0 NA NA
# 2 1 15 0 NA NA
# 3 1 8 0 NA NA
# 4 1 6 0 NA NA
# 5 1 NA 0 9.75 3.86
# 6 1 10 1 NA NA
# 7 1 20 1 NA NA
# 8 1 NA 1 15.0 7.07
# 9 1 14 2 NA NA
#10 1 2 2 NA NA
#11 2 8 2 NA NA
#12 2 6 2 NA NA
#13 2 NA 2 7.00 1.41
关于r - 查找 R 中组的下一个 NA 值之前的行平均值和标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48267253/