我有一個日期串列,想在現有資料框中為串列中的每個元素創建一個列,如果日期在開始日期和結束日期之間,我想要一個 1。
input:
my_date = as.Date(c("2022-10-02","2022-10-31","2022-10-05"))
df1 <- data.frame(ID = c(1, 2, 3),
start_date = as.Date(c("2022-10-01","2022-10-08","2022-10-01")),
end_date = as.Date(c("2022-10-22","2022-10-22","2022-10-08")))
output:
df1 <- data.frame(ID = c(1, 2, 3),
start_date = as.Date(c("2022-10-01","2022-10-08","2022-10-01")),
end_date = as.Date(c("2022-10-22","2022-10-22","2022-10-08")),
flag_1= c(1,0,1), flag_2=c(0,0,0), flag_3= c(1,0,1))
我可以手動完成,但我必須有很多行。我正在尋找一個 mutate 的解決方案,但不知道如何實作。
uj5u.com熱心網友回復:
使用基地:
cbind(df1,
lapply(setNames(my_date, paste0("flag_", seq_along(my_date))),
function(i) as.integer(df1$start_date <= i & df1$end_date >= i)))
# ID start_date end_date flag_1 flag_2 flag_3
# 1 1 2022-10-01 2022-10-22 1 0 1
# 2 2 2022-10-08 2022-10-22 0 0 0
# 3 3 2022-10-01 2022-10-08 1 0 1
uj5u.com熱心網友回復:
你想要這樣的東西嗎?我假設您想將每個元素my_date與相應的行進行比較,df1而不是每一行。
library(tidyverse)
df1 |>
mutate(flag = pmap_dbl(list(start_date, end_date, my_date),
~` `(between(..3, ..1, ..2))) )
#> ID start_date end_date flag
#> 1 1 2022-10-01 2022-10-22 1
#> 2 2 2022-10-08 2022-10-22 0
#> 3 3 2022-10-01 2022-10-08 1
從澄清中編輯
df1 |>
mutate(flag = map2(start_date, end_date,
~pmap_dbl(list(.x, .y, my_date),
~` `(between(..3, ..1, ..2))))) |>
unnest_wider(flag, names_sep = "_")
#> # A tibble: 3 x 6
#> ID start_date end_date flag_1 flag_2 flag_3
#> <dbl> <date> <date> <dbl> <dbl> <dbl>
#> 1 1 2022-10-01 2022-10-22 1 0 1
#> 2 2 2022-10-08 2022-10-22 0 0 0
#> 3 3 2022-10-01 2022-10-08 1 0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/520907.html
標籤:rtidyverse
