如果 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
填充条件如下
- 如果“water_on”日期和时间先于“随机化”中的时间和日期,则该行的随机化数据和时间被复制到“true_water_on”中。 study_ID 6 和 8 会出现这种情况;如
所示
trial_A %>% mutate(TD_ran_waterstart = water_on - randomisation, units="mins")
如果“water_on”日期和时间出现在时间和日期之后
“随机化”然后复制该行的 water_on 数据
进入“water_drug_on”
如果“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 所说,这看起来像是 ifelse
或 case_when
在 dplyr
中的简单应用。
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
我希望在数据框 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
填充条件如下
- 如果“water_on”日期和时间先于“随机化”中的时间和日期,则该行的随机化数据和时间被复制到“true_water_on”中。 study_ID 6 和 8 会出现这种情况;如 所示
trial_A %>% mutate(TD_ran_waterstart = water_on - randomisation, units="mins")
如果“water_on”日期和时间出现在时间和日期之后 “随机化”然后复制该行的 water_on 数据 进入“water_drug_on”
如果“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 所说,这看起来像是 ifelse
或 case_when
在 dplyr
中的简单应用。
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