簡體   English   中英

如果某個日期大於其他日期,則交換日期和月份

[英]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)

輸入應按照標簽頁頂部的要求以可重現的形式顯示。 這次我已經在最后的注釋中為您完成了。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM