我正在尝试根据R中的ID列和测量时间标签创建列的滚动平均值,但是我遇到了很多麻烦。
这是我的数据框的样子:
ID Measurement Value
A 1 10
A 2 12
A 3 14
B 1 10
B 2 12
B 3 14
B 4 10
问题是我对每个ID的测量计数从9到76不等,所以我没有找到一种解决方案来在处理变化的窗口长度时为每个ID创建滚动平均值的列。
我的目标是这样的数据框:
ID Measurement Value Average
A 1 10 NA
A 2 12 11
A 3 14 12
B 1 10 NA
B 2 12 11
B 3 14 12
B 4 10 11.5
答案 0 :(得分:1)
使用您的数据:
library(dplyr)
dat %>%
group_by(Id) %>%
mutate(Avrg = cumsum(Value)/(1:n()))
# A tibble: 7 x 4
# Groups: Id [2]
Id Measurement Value Avrg
<chr> <int> <int> <dbl>
1 A 1 10 10
2 A 2 12 11
3 A 3 14 12
4 B 1 10 10
5 B 2 12 11
6 B 3 14 12
7 B 4 10 11.5
数据:
structure(list(Id = c("A", "A", "A", "B", "B", "B", "B"),
Measurement = c(1L, 2L, 3L, 1L, 2L, 3L, 4L),
Value = c(10L, 12L, 14L, 10L, 12L, 14L, 10L)
),
class = "data.frame", row.names = c(NA, -7L))
P.S。我很确定10的平均值是10,而不是NA
答案 1 :(得分:1)
library(dplyr)
data %>%
group_by(ID) %>%
mutate(rolling_mean = cummean(Value))
第一行将是每个组(ID)的第一个值的平均值,而不是NA。
答案 2 :(得分:0)
这不使用任何软件包。它通过ID计算累积平均值,除了Measurement
等于1时会强制平均值为NA
。
transform(DF, Avg = ave(Value, ID, FUN = cumsum) /
ifelse(Measurement == 1, NA, Measurement))
给予:
ID Measurement Value Avg
1 A 1 10 NA
2 A 2 12 11.0
3 A 3 14 12.0
4 B 1 10 NA
5 B 2 12 11.0
6 B 3 14 12.0
7 B 4 10 11.5
可重复形式的输入DF
为:
Lines <- "ID Measurement Value
A 1 10
A 2 12
A 3 14
B 1 10
B 2 12
B 3 14
B 4 10"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE, as.is = TRUE)