如何在 R 中随着时间的推移迭代不同的 ID?
How do I iterate over time for different IDs in R?
我正在尝试在 R 中对资产随时间贬值进行建模。我有一个数据集 df=tibble(expand_grid(id=1:2, time=1:10), assets=id * 5000)
,并且想要显示每个 id 在每个时期下降 250 的资产。我试过了
input_data %>%
group_by(id) %>%
mutate(assets = case_when(time > 1 ~ lag(assets) - 250, TRUE ~ assets))
但这并没有按照我想要的方式迭代。我也尝试过使用 for 循环,但我只知道如何为第一个 ID 执行此操作 -
for (i in 2:max(input_data$time)) {
input_data$assets[i] <- input_data$assets[i-1] - 250
}
关于如何为每个 ID 执行 for 循环所执行的相同操作,我真的很想得到建议 - 输入数据集应该有大约 100 个 ID,以便循环遍历它们或拆分数据集并将 for 循环应用于每个组,会有所帮助。我特别感谢使用 tidyverse 函数的答案,因为我更了解它们。
谢谢!我希望这已经足够清楚了。
我想这就是你想要的。我创建了一个序列 assets_drop
以确保此代码在时间为日期时也能正常工作。
input_data %>%
group_by(id) %>%
mutate(assets_drop = seq(0, length.out = n(), by = 250),
assets_new = assets - assets_drop)
输出为
# A tibble: 20 x 5
# Groups: id [2]
id time assets assets_drop assets_new
<int> <int> <dbl> <dbl> <dbl>
1 1 1 5000 0 5000
2 1 2 5000 250 4750
3 1 3 5000 500 4500
4 1 4 5000 750 4250
5 1 5 5000 1000 4000
6 1 6 5000 1250 3750
7 1 7 5000 1500 3500
8 1 8 5000 1750 3250
9 1 9 5000 2000 3000
10 1 10 5000 2250 2750
11 2 1 10000 0 10000
12 2 2 10000 250 9750
13 2 3 10000 500 9500
14 2 4 10000 750 9250
15 2 5 10000 1000 9000
16 2 6 10000 1250 8750
17 2 7 10000 1500 8500
18 2 8 10000 1750 8250
19 2 9 10000 2000 8000
20 2 10 10000 2250 7750
与@tivd 的方法类似,这里我定义每个时期的折旧,然后计算所有先前折旧的总和,然后将资产重新定义为其原始价值减去该点的折旧。
df %>%
group_by(id) %>%
mutate(deprec_period = 250,
deprec = pmin(assets, cumsum(lag(deprec_period, default = 0))),
assets = assets - deprec)
我正在尝试在 R 中对资产随时间贬值进行建模。我有一个数据集 df=tibble(expand_grid(id=1:2, time=1:10), assets=id * 5000)
,并且想要显示每个 id 在每个时期下降 250 的资产。我试过了
input_data %>%
group_by(id) %>%
mutate(assets = case_when(time > 1 ~ lag(assets) - 250, TRUE ~ assets))
但这并没有按照我想要的方式迭代。我也尝试过使用 for 循环,但我只知道如何为第一个 ID 执行此操作 -
for (i in 2:max(input_data$time)) {
input_data$assets[i] <- input_data$assets[i-1] - 250
}
关于如何为每个 ID 执行 for 循环所执行的相同操作,我真的很想得到建议 - 输入数据集应该有大约 100 个 ID,以便循环遍历它们或拆分数据集并将 for 循环应用于每个组,会有所帮助。我特别感谢使用 tidyverse 函数的答案,因为我更了解它们。
谢谢!我希望这已经足够清楚了。
我想这就是你想要的。我创建了一个序列 assets_drop
以确保此代码在时间为日期时也能正常工作。
input_data %>%
group_by(id) %>%
mutate(assets_drop = seq(0, length.out = n(), by = 250),
assets_new = assets - assets_drop)
输出为
# A tibble: 20 x 5
# Groups: id [2]
id time assets assets_drop assets_new
<int> <int> <dbl> <dbl> <dbl>
1 1 1 5000 0 5000
2 1 2 5000 250 4750
3 1 3 5000 500 4500
4 1 4 5000 750 4250
5 1 5 5000 1000 4000
6 1 6 5000 1250 3750
7 1 7 5000 1500 3500
8 1 8 5000 1750 3250
9 1 9 5000 2000 3000
10 1 10 5000 2250 2750
11 2 1 10000 0 10000
12 2 2 10000 250 9750
13 2 3 10000 500 9500
14 2 4 10000 750 9250
15 2 5 10000 1000 9000
16 2 6 10000 1250 8750
17 2 7 10000 1500 8500
18 2 8 10000 1750 8250
19 2 9 10000 2000 8000
20 2 10 10000 2250 7750
与@tivd 的方法类似,这里我定义每个时期的折旧,然后计算所有先前折旧的总和,然后将资产重新定义为其原始价值减去该点的折旧。
df %>%
group_by(id) %>%
mutate(deprec_period = 250,
deprec = pmin(assets, cumsum(lag(deprec_period, default = 0))),
assets = assets - deprec)