使用 groupby 和可变 window 长度的滚动平均值
Rolling average using groupby and varying window length
我正在尝试根据 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 创建一个滚动平均值列,同时处理变化 window长度。
我的目标是这样的数据框:
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
你的数据:
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
library(dplyr)
data %>%
group_by(ID) %>%
mutate(rolling_mean = cummean(Value))
第一行将是每个组 (ID) 的第一个值的平均值,而不是 NA。
这不使用包。它通过 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)
我正在尝试根据 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 创建一个滚动平均值列,同时处理变化 window长度。
我的目标是这样的数据框:
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
你的数据:
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
library(dplyr)
data %>%
group_by(ID) %>%
mutate(rolling_mean = cummean(Value))
第一行将是每个组 (ID) 的第一个值的平均值,而不是 NA。
这不使用包。它通过 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)