[英]How do I iterate over time for different IDs in R?
我正在嘗試 model 資產在 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)
output 是
# 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.