[英]exchange the day and month if some date is greater than other
我想用月份替換日期,反之亦然。 例如,我有入院和出院日期(如果入院日期大於出院日期)將日更改為月,將月更改為日(例如,入院 = 04/11/2021 和出院 = 13/4/2021 然后更改入場到 11/04/2021)
入學日期 04/11/2021 04/12/2021 04/10/2021 13/04/2021 13/04/2021 04/12/2021
出院日期 13/4/2021 13/4/2021 13/4/2021 13/4/2021 13/4/2021 13/4/2021
您可以嘗試以下功能。 如果日分量大於 12,則代碼不會交換日和月。
swap_day_month <- function(d1, d2) {
# Function to swap the day and month of a given date (d1) if d1 > d2 AND results in a valid date
# Extract date components
dd <- format(d1, "%d")
mm <- format(d1, "%m")
yyyy <- format(d1, "%Y")
# Only swap if d1 > d2 AND the day component of d1 is <= 12
swap <- which(d1 > d2 & dd <= 12)
d1_swapped <- d1[swap]
for(i in seq_along(swap)) {
d1_swapped[i] <- as.Date(paste(yyyy[swap[i]], dd[swap[i]], mm[swap[i]], sep="-"))
}
d1[swap] <- d1_swapped
return(d1)
}
調用函數:
adm_swapped <- swap_day_month(adm, dsc)
查看
data.frame(adm, dsc, swapped=ifelse(adm!=adm_swapped, "*", ""), adm_swapped, los=dsc-adm_swapped)
adm dsc swapped adm_swapped los
1 2021-11-25 2021-05-11 2021-11-25 -198 days
2 2021-11-09 2021-10-15 * 2021-09-11 34 days
3 2021-04-05 2021-01-09 * 2021-05-04 -115 days
4 2021-07-28 2021-12-18 2021-07-28 143 days
5 2021-12-17 2021-12-21 2021-12-17 4 days
6 2021-11-13 2021-12-20 2021-11-13 37 days
7 2021-11-11 2021-09-01 2021-11-11 -71 days
8 2021-09-03 2021-06-08 * 2021-03-09 91 days
9 2021-12-21 2021-11-12 2021-12-21 -39 days
10 2021-05-08 2021-04-05 * 2021-08-05 -122 days
我使用了以下人為數據:
d1 <- as.Date("2021-01-01")
d2 <- as.Date("2021-12-31")
n <- 10
set.seed(101)
random_dates <- function(d1, d2, n) {
sample(seq(d1, d2, by=1), size=n)
}
adm <- random_dates(d1, d2, n)
dsc <- random_dates(d1, d2, n)
輸入應按照r標簽頁頂部的要求以可重現的形式顯示。 這次我已經在最后的注釋中為您完成了。
1) 轉換現在將日期轉換為 Date 類,以便可以比較它們,然后使用 ADMISSION_DATE 的最小值和 DISCHARGE_DATE 的最大值。 沒有使用包。
fmt <- "%d/%m/%Y"
DF |>
transform(ADMISSION_DATE = as.Date(ADMISSION_DATE, fmt),
DISCHARGE_DATE = as.Date(DISCHARGE_DATE, fmt)) |>
transform(ADMISSION_DATE = pmin(ADMISSION_DATE, DISCHARGE_DATE),
DISCHARGE_DATE = pmax(ADMISSION_DATE, DISCHARGE_DATE))
給予
ADMISSION_DATE DISCHARGE_DATE
1 2021-04-13 2021-11-04
2 2021-04-13 2021-12-04
3 2021-04-13 2021-10-04
4 2021-04-13 2021-04-13
5 2021-04-13 2021-04-13
6 2021-04-13 2021-12-04
2) dplyr如果我們想使用 dplyr,我們不能只用mutate
替換transform
,因為transform
從輸入中獲取右側,而mutate
按順序操作。 我們需要將每個日期分配給其他名稱,以免在獲取最小值和最大值之前覆蓋它們。 我們已經挑選出以 _DATE 結尾的列,以防實際數據中有其他列。
library(dplyr)
fmt <- "%d/%m/%Y"
DF %>%
mutate(across(ends_with("_DATE"), as.Date, format = fmt, .names = "{.col}2"),
ADMISSION_DATE = Reduce(pmin, across(ends_with("_DATE2"))),
DISCHARGE_DATE = Reduce(pmax, across(ends_with("_DATE2")))) %>%
select(-ends_with("_DATE2"))
ADMISSION_DATE <- c("04/11/2021", "04/12/2021", "04/10/2021",
"13/04/2021", "13/04/2021", "04/12/2021")
DISCHARGE_DATE <- c("13/4/2021", "13/4/2021", "13/4/2021",
"13/4/2021", "13/4/2021", "13/4/2021")
DF <- data.frame(ADMISSION_DATE, DISCHARGE_DATE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.