我有一些類似于以下的時間序列資料:
df <- data.frame(id = c("001","001","001","002", "003","003","003","003",
"004","004","004","005"),
year_mon = c(2021-01, 2021-02, 2021-03, 2021-01, 2021-01, 2021-05, 2021-06,
2021-08, 2021-03, 2021-04, 2021-07, 2021-08),
value = c(15, 20, 25, 30, 19, 17, 18, 21, 39, 45, 21, 10))
id year_mon value
001 2021-01 15
001 2021-02 20
001 2021-03 25
002 2021-01 30
003 2021-01 19
003 2021-05 17
003 2021-06 18
003 2021-08 21
004 2021-03 39
004 2021-04 45
004 2021-07 21
005 2021-08 10
我想將每個“價值”滯后 1 個月id。但是,該year_mon列中缺少一些日期。
我試著做:
new_df <- df %>%
arrange(id, year_mon) %>%
group_by(id) %>%
mutate(lag_value = lag(value, 1L))
但這是從上一行回傳值,而不是上個月。我該怎么做才能使資料輸出為:
id year_mon value lag_value
001 2021-01 15 NA
001 2021-02 20 15
001 2021-03 25 20
002 2021-01 30 NA
003 2021-01 19 NA
003 2021-05 17 NA
003 2021-06 18 17
003 2021-08 21 NA
004 2021-03 39 NA
004 2021-04 45 39
004 2021-07 21 NA
005 2021-08 10 NA
NA如果月份year_mon不是 -1 個月,則回傳an 。
uj5u.com熱心網友回復:
通過將它們轉換為日期并使用來臨時填充所有缺失的月份 complete
df %>%
mutate(
Date1 = as.Date(paste(year_mon,"-01",sep=""))
) %>%
arrange(id, year_mon) %>%
group_by(id) %>%
complete(Date1 = seq.Date(min(Date1), max(Date1), by='month')) %>%
mutate(lag_value = lag(value, 1L)) %>%
filter(!is.na(year_mon)) %>%
select(-Date1)
id year_mon value lag_value
<chr> <chr> <dbl> <dbl>
1 001 2021-01 15 NA
2 001 2021-02 20 15
3 001 2021-03 25 20
4 002 2021-01 30 NA
5 003 2021-01 19 NA
6 003 2021-05 17 NA
7 003 2021-06 18 17
8 003 2021-08 21 NA
9 004 2021-03 39 NA
10 004 2021-04 45 39
11 004 2021-07 21 NA
12 005 2021-08 10 NA
uj5u.com熱心網友回復:
定義一個函式 diff_mon,它回傳當前 year_mon 和前一個之間的月差。它將引數轉換為 yearmon 類,然后使用 diff 來獲取當前條目和之前條目之間的年份差異。將其乘以 12 并四舍五入得出當前專案和上一個專案之間的月數。如果為 1,則使用滯后,否則使用 NA。
library(dplyr)
library(zoo)
# difference in months.
# x is character vec with format yyyy-mm (or has class with as.yearmon method)
diff_mon <- function(x) round(12 * c(NA, diff(as.yearmon(x))))
df %>%
arrange(id, year_mon) %>%
group_by(id) %>%
mutate(lag = ifelse(diff_mon(year_mon) == 1, lag(value), NA)) %>%
ungroup
給予:
# A tibble: 12 x 4
id year_mon value lag
<chr> <chr> <dbl> <dbl>
1 001 2021-01 15 NA
2 001 2021-02 20 15
3 001 2021-03 25 20
4 002 2021-01 30 NA
5 003 2021-01 19 NA
6 003 2021-05 17 NA
7 003 2021-06 18 17
8 003 2021-08 21 NA
9 004 2021-03 39 NA
10 004 2021-04 45 39
11 004 2021-07 21 NA
12 005 2021-08 10 NA
筆記
問題中的 year_mon 值周圍缺少引號,所以我們使用了這個。
df <- structure(list(id = c("001", "001", "001", "002", "003", "003",
"003", "003", "004", "004", "004", "005"), year_mon = c("2021-01",
"2021-02", "2021-03", "2021-01", "2021-01", "2021-05", "2021-06",
"2021-08", "2021-03", "2021-04", "2021-07", "2021-08"), value = c(15,
20, 25, 30, 19, 17, 18, 21, 39, 45, 21, 10)), class = "data.frame", row.names = c(NA,
-12L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/404933.html
標籤:
