R 中按行变化的变量计算

问题描述 投票:0回答:1

我有这样的数据:

library(dplyr)


set.seed(123)  
data <- data.frame(
  date = rep(1:3, each=3),
  grupo = rep(c("A", "B", "C"), 3),
  x = runif(9, 10, 50),
  y = runif(9, 20, 100),
  z = runif(9, 5, 30)
)

# Convertir group into factor
data$grupo <- as.factor(data$grupo)

# Order data 
data <- data %>% arrange(grupo, date)

我希望每行的第一个观察值是(1+original_value/100)。但是,从第二行开始,我希望将公式修改为first_modified_value *(1 + secondary_observed_value / 100),第三个新行将执行:second_modified_value *(1 + Third_observed_value / 100)。

我生成了以下公式,但我无法说明 lag() 应该采用修改后的值,而不是 lag(原始值):

# Apply formula in each group for variables, x,y,z
dataaa <- data %>% 
  group_by(grupo) %>% 
  mutate(across(c(x, y, z), ~if_else(row_number() == 1, (1 + ./100), lag(.)*(1 + ./100))))

有什么帮助吗?

r dplyr across
1个回答
0
投票

当您将每个值乘以之前的结果时,

cumprod()
函数似乎就是答案:

dataaa <- data %>%
  group_by(grupo) %>%
  mutate(across(c(x, y, z), ~cumprod(1 + . / 100)))

dataaa
# A tibble: 9 × 5
# Groups:   grupo [3]
   date grupo     x     y     z
  <int> <fct> <dbl> <dbl> <dbl>
1     1 A      1.22  1.57  1.13
2     2 A      1.77  2.73  1.38
3     3 A      2.32  5.24  1.68
4     1 B      1.42  1.97  1.29
5     2 B      2.09  3.26  1.56
6     3 B      3.04  4.55  1.91
7     1 C      1.26  1.56  1.27
8     2 C      1.41  2.00  1.65
9     3 C      1.87  2.47  1.96
© www.soinside.com 2019 - 2024. All rights reserved.