在 R 中应用具有特定条件的移动平均值和滚动 window
Apply the moving average with a specific condition and a rolling window in R
df <- structure(
list(
inv = c("INV_1", "INV_1", "INV_1", "INV_1", "INV_1", "INV_2", "INV_2", "INV_2", "INV_2", "INV_2", "INV_2"),
ass = c("x", "x", "x", "y", "y", "x", "x", "x", "t", "t", "t"),
datetime = c("2010-01-01", "2010-01-02", "2010-01-03", "2010-01-08", "2010-01-19", "2010-02-20", "2010-02-22", "2010-02-23", "2010-03-01", "2010-03-02", "2010-03-04"),
price = c(10, 10, 19, 9, 3 , 5, 1, 4, 4, 5, 1),
operation = c(10, 0, 2, 2, 0, 5, 5, 5, 3, 0, 2)
),
class = "data.frame", row.names = c(NA, -11L)
)
我有这个数据框,我想为其计算“价格”列的移动平均值。
特别是我需要在执行此操作之前应用一个小的更改。如果该行的“操作”值等于 0,我想更改“价格”列值。
因此我需要 R 来:
df <- df %>% mutate( price = if_else(operation == 0, NA, price)
然后当 price == NA 时,用价格列的移动平均线填充该值。
因为我可以在价格栏中有连续的 NA,所以我认为移动平均线应该滚动 window.
我是 R 的新用户,所以我不知道如何操作。
任何的想法?
如果可能的话,我更喜欢 dplyr 解决方案
假设目的是要计算从开始到当前行的修改价格的平均值,其中 0 行 NA'd out,以便它们从平均值中消除,试试这个。例如,第三行应该使用 10 和 19 的平均值,即 14.5。
该代码指定了 n()(= 行数)个元素的平均值,但 partial=TRUE 指示它只使用无论数量少还是数量少的情况。 na.rm=TRUE 导致 NA 未包含在平均值中。我们从 dplyr 中排除了 filter 和 lag,因为它们破坏了 R 中同名的函数,因此往往导致难以检测到错误。如果您需要使用它们,请使用 dplyr::lag 和 dplyr::filter.
library(dplyr, exclude = c("filter", "lag"))
library(zoo)
df %>%
mutate(price = ifelse(operation == 0, NA, price),
avg = rollapplyr(price, n(), mean, na.rm = TRUE, partial = TRUE))
这个变体也有效。 1:n() 指定第 i 个元素应用于第 i 行。同样,na.rm=TRUE 将从计算中消除 NA。
df %>%
mutate(price = ifelse(operation == 0, NA, price),
avg = rollapplyr(price, 1:n(), mean, na.rm = TRUE))
如果目的是用操作 > 0 的前几行的平均价格改变价格;然后这是我的 dplyr 代码。
df <- tibble(df)
df %>%
mutate( price = ifelse( operation==0, 0 ,price)) %>%
mutate(runinngsumPrice = cumsum(price)) %>%
mutate(runinngsumNNA = cumsum(ifelse(operation==0,0,1))) %>%
mutate( price = ifelse( operation==0, runinngsumPrice/runinngsumNNA ,price)) %>%
select(1:5)
#
# # A tibble: 11 x 5
# inv ass datetime price operation
# <chr> <chr> <chr> <dbl> <dbl>
# 1 INV_1 x 2010-01-01 10 10
# 2 INV_1 x 2010-01-02 10 0
# 3 INV_1 x 2010-01-03 19 2
# 4 INV_1 y 2010-01-08 9 2
# 5 INV_1 y 2010-01-19 12.7 0
# 6 INV_2 x 2010-02-20 5 5
# 7 INV_2 x 2010-02-22 1 5
# 8 INV_2 x 2010-02-23 4 5
# 9 INV_2 t 2010-03-01 4 3
# 10 INV_2 t 2010-03-02 7.43 0
# 11 INV_2 t 2010-03-04 1 2
df <- structure(
list(
inv = c("INV_1", "INV_1", "INV_1", "INV_1", "INV_1", "INV_2", "INV_2", "INV_2", "INV_2", "INV_2", "INV_2"),
ass = c("x", "x", "x", "y", "y", "x", "x", "x", "t", "t", "t"),
datetime = c("2010-01-01", "2010-01-02", "2010-01-03", "2010-01-08", "2010-01-19", "2010-02-20", "2010-02-22", "2010-02-23", "2010-03-01", "2010-03-02", "2010-03-04"),
price = c(10, 10, 19, 9, 3 , 5, 1, 4, 4, 5, 1),
operation = c(10, 0, 2, 2, 0, 5, 5, 5, 3, 0, 2)
),
class = "data.frame", row.names = c(NA, -11L)
)
我有这个数据框,我想为其计算“价格”列的移动平均值。
特别是我需要在执行此操作之前应用一个小的更改。如果该行的“操作”值等于 0,我想更改“价格”列值。
因此我需要 R 来:
df <- df %>% mutate( price = if_else(operation == 0, NA, price)
然后当 price == NA 时,用价格列的移动平均线填充该值。 因为我可以在价格栏中有连续的 NA,所以我认为移动平均线应该滚动 window.
我是 R 的新用户,所以我不知道如何操作。 任何的想法? 如果可能的话,我更喜欢 dplyr 解决方案
假设目的是要计算从开始到当前行的修改价格的平均值,其中 0 行 NA'd out,以便它们从平均值中消除,试试这个。例如,第三行应该使用 10 和 19 的平均值,即 14.5。
该代码指定了 n()(= 行数)个元素的平均值,但 partial=TRUE 指示它只使用无论数量少还是数量少的情况。 na.rm=TRUE 导致 NA 未包含在平均值中。我们从 dplyr 中排除了 filter 和 lag,因为它们破坏了 R 中同名的函数,因此往往导致难以检测到错误。如果您需要使用它们,请使用 dplyr::lag 和 dplyr::filter.
library(dplyr, exclude = c("filter", "lag"))
library(zoo)
df %>%
mutate(price = ifelse(operation == 0, NA, price),
avg = rollapplyr(price, n(), mean, na.rm = TRUE, partial = TRUE))
这个变体也有效。 1:n() 指定第 i 个元素应用于第 i 行。同样,na.rm=TRUE 将从计算中消除 NA。
df %>%
mutate(price = ifelse(operation == 0, NA, price),
avg = rollapplyr(price, 1:n(), mean, na.rm = TRUE))
如果目的是用操作 > 0 的前几行的平均价格改变价格;然后这是我的 dplyr 代码。
df <- tibble(df)
df %>%
mutate( price = ifelse( operation==0, 0 ,price)) %>%
mutate(runinngsumPrice = cumsum(price)) %>%
mutate(runinngsumNNA = cumsum(ifelse(operation==0,0,1))) %>%
mutate( price = ifelse( operation==0, runinngsumPrice/runinngsumNNA ,price)) %>%
select(1:5)
#
# # A tibble: 11 x 5
# inv ass datetime price operation
# <chr> <chr> <chr> <dbl> <dbl>
# 1 INV_1 x 2010-01-01 10 10
# 2 INV_1 x 2010-01-02 10 0
# 3 INV_1 x 2010-01-03 19 2
# 4 INV_1 y 2010-01-08 9 2
# 5 INV_1 y 2010-01-19 12.7 0
# 6 INV_2 x 2010-02-20 5 5
# 7 INV_2 x 2010-02-22 1 5
# 8 INV_2 x 2010-02-23 4 5
# 9 INV_2 t 2010-03-01 4 3
# 10 INV_2 t 2010-03-02 7.43 0
# 11 INV_2 t 2010-03-04 1 2