如果 A 列 > B 列,如何将值从一列复制到新列?

How to copy a value from one column to a new column if column A > column B?

我希望在数据框 trial_A 中创建一个名为 true_water_on 的新列。

  study_ID       randomisation            water_on           water_off
1        5 2021-01-01 11:00:00 2021-01-01 13:00:00 2021-01-01 18:00:00
2        6 2021-01-02 10:00:00 2021-01-02 09:00:00 2021-01-02 18:00:00
3        7 2021-01-03 10:00:00                <NA>                <NA>
4        8 2021-01-04 10:00:00 2021-01-04 09:45:00 2021-01-04 11:00:00

填充条件如下

  1. 如果“water_on”日期和时间先于“随机化”中的时间和日期,则该行的随机化数据和时间被复制到“true_water_on”中。 study_ID 6 和 8 会出现这种情况;如
  2. 所示
trial_A %>% mutate(TD_ran_waterstart = water_on - randomisation, units="mins")
  1. 如果“water_on”日期和时间出现在时间和日期之后 “随机化”然后复制该行的 water_on 数据 进入“water_drug_on”

  2. 如果“water_on”中没有记录数据和时间,那么NA就是 标记为“true_water_on”

数据

trial_A <- 
  data.frame(study_ID=c(5, 6, 7, 8), 
             randomisation=as.POSIXlt(c("2021-01-01 11:00", "2021-01-02 10:00", 
                                        "2021-01-03 10:00", "2021-01-04 10:00")), 
             water_on=as.POSIXlt(c("2021-01-01 13:00", "2021-01-02 09:00", NA, 
                                   "2021-01-04 09:45")), 
             water_off=as.POSIXlt(c("2021-01-01 18:00", "2021-01-02 18:00", NA, 
                                    "2021-01-04 11:00")))

正如@IRTFM 所说,这看起来像是 ifelsecase_whendplyr 中的简单应用。

library(dplyr)

trial_A %>%
  mutate(true_water_on = case_when(water_on < randomisation ~ randomisation, 
                                   water_on > randomisation ~ water_on))

#  study_ID       randomisation            water_on           water_off       true_water_on
#1        5 2021-01-01 11:00:00 2021-01-01 13:00:00 2021-01-01 18:00:00 2021-01-01 13:00:00
#2        6 2021-01-02 10:00:00 2021-01-02 09:00:00 2021-01-02 18:00:00 2021-01-02 10:00:00
#3        7 2021-01-03 10:00:00                <NA>                <NA>                <NA>
#4        8 2021-01-04 10:00:00 2021-01-04 09:45:00 2021-01-04 11:00:00 2021-01-04 10:00:00

case_when中如果none个条件符合则默认returnsNA

您可以简单地使用 max.

transform(trial_A, true_water_on=apply(trial_A[2:3], 1, max))
#  study_ID       randomisation            water_on           water_off       true_water_on
# 1        5 2021-01-01 11:00:00 2021-01-01 13:00:00 2021-01-01 18:00:00 2021-01-01 13:00:00
# 2        6 2021-01-02 10:00:00 2021-01-02 09:00:00 2021-01-02 18:00:00 2021-01-02 10:00:00
# 3        7 2021-01-03 10:00:00                <NA>                <NA>                <NA>
# 4        8 2021-01-04 10:00:00 2021-01-04 09:45:00 2021-01-04 11:00:00 2021-01-04 10:00:00