我有一個這種形狀的資料框:
date date_lag test_date
<date> <dbl> <date>
1 2018-12-01 NA 2018-12-01
2 2019-03-01 90 2019-03-01
3 2019-05-01 61 2019-03-01
4 2020-03-10 314 2020-03-10
5 2020-03-16 6 2020-03-10
6 2020-03-23 7 2020-03-16
7 2020-03-24 1 2020-03-23
為了創建date_lag& test_date,我應用了以下代碼:
lag <- lag %>%
mutate(date_lag = as.numeric(date - lag(date), units="days")) %>%
mutate(test_date = case_when(
is.na(date_lag) ~ date,
date_lag < 69 ~ date-date_lag,
TRUE ~ date))
如果日期相隔不到 69 天,我希望它們具有相同的日期。我的代碼的問題是,如果您看到第 6 列,我不希望它具有第 5 列的日期,而是第 4 列的日期,因為 date_lag 與上一列相距仍小于 69 天,這意味著我的所需的資料將如下所示:
date date_lag test_date
<date> <dbl> <date>
1 2018-12-01 NA 2018-12-01
2 2019-03-01 90 2019-03-01
3 2019-05-01 61 2019-03-01
4 2020-03-10 314 2020-03-10
5 2020-03-16 6 2020-03-10
6 2020-03-23 7 2020-03-10
7 2020-03-24 1 2020-03-10
提前致謝。
uj5u.com熱心網友回復:
迭代日期。對于每個,計算與所有其他日期的差異。使用這些差異,找出比索引日期早 69 天的最早日期。
library(dplyr)
library(purrr)
library(lubridate)
# example data
date_df <- tibble(
date = ymd("2018-12-01", "2019-03-01", "2019-05-01", "2020-03-10",
"2020-03-16", "2020-03-23", "2020-03-24")
)
earliest_within <- function(dates, n) {
map(dates, ~ min(dates[.x - dates < n])) %>%
unlist() %>%
as_date()
}
date_df %>%
mutate(test_date = earliest_within(date, 69))
#> # A tibble: 7 × 2
#> date test_date
#> <date> <date>
#> 1 2018-12-01 2018-12-01
#> 2 2019-03-01 2019-03-01
#> 3 2019-05-01 2019-03-01
#> 4 2020-03-10 2020-03-10
#> 5 2020-03-16 2020-03-10
#> 6 2020-03-23 2020-03-10
#> 7 2020-03-24 2020-03-10
uj5u.com熱心網友回復:
data.table選項,它可能適用于更大的資料集:
library(data.table)
dat[, test_date := dat[
dat[, .(date, datem69 = date-69)],
on=.(date<=date, date>=datem69), x.date, mult="first"]
]
## date test_date
##1: 2018-12-01 2018-12-01
##2: 2019-03-01 2019-03-01
##3: 2019-05-01 2019-03-01
##4: 2020-03-10 2020-03-10
##5: 2020-03-16 2020-03-10
##6: 2020-03-23 2020-03-10
##7: 2020-03-24 2020-03-10
在哪里dat:
library(data.table)
dat <- fread("date
2018-12-01
2019-03-01
2019-05-01
2020-03-10
2020-03-16
2020-03-23
2020-03-24")
uj5u.com熱心網友回復:
我使用了shift()里面的函式ifelse并得到了你想要的輸出。它上升指定數量的行并獲取值。
library(dplyr)
library(data.table)
lag <- lag %>%
mutate(
test_date=ifelse(date_lag > 68 | is.na(date_lag),
date,
shift(date,1))
)
lag
date date_lag test_date
1 2018-12-01 NA 2018-12-01
2 2019-03-01 90 2019-03-01
3 2019-05-01 61 2019-03-01
4 2020-03-10 314 2020-03-10
5 2020-03-16 6 2020-03-10
6 2020-03-23 7 2020-03-16
7 2020-03-24 1 2020-03-23
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/522215.html
標籤:r日期
下一篇:如何從歷史表中跟蹤有效和有效到
