您可以使用ifelse 来定义条件值。
ifelse 的第一个参数是条件。在这种情况下,我们希望!is.na(date_b)|!is.na(c) 指示其中一个是否不是NA。如果第一个参数的计算结果为TRUE,那么第二个参数就是我们想要的。在这种情况下,可以只返回 date_a 的值。如果参数 1 的计算结果为 FALSE,那么最后一个参数就是我们想要的,我们需要使用 NA_character,因为该列的其余部分是字符。
library(dplyr)
df %>%
mutate(date_a = ifelse(!is.na(date_b)|!is.na(c),NA_character_,date_a))
date_a date_b c
1 2012-10-11 <NA> <NA>
2 <NA> 2016-01-08 house
3 2019-12-19 <NA> <NA>
4 2019-06-14 <NA> <NA>
5 2014-04-22 <NA> <NA>
6 <NA> 2017-08-03 boat
7 2018-11-20 <NA> <NA>
8 <NA> 2017-06-16 boat
9 <NA> 2016-03-17 boat
case_when也可以这样做,但只有一个条件时就不需要了:
df %>%
mutate(date_a = case_when(!is.na(date_b)|!is.na(c) ~ NA_character_,
TRUE ~ date_a))
如果您的列属于不同的类别(正如 @akrun 在 cmets 中指出的那样),例如 Date,您可以尝试以下操作:
df %>%
mutate(date_a = case_when(!is.na(date_b)|!is.na(c) ~ as.Date(NA), TRUE ~ date_a))
样本数据:
df <- structure(list(date_a = c("2012-10-11", "2016-01-08", "2019-12-19",
"2019-06-14", "2014-04-22", "2017-08-03", "2018-11-20", "2017-06-16",
"2016-03-17"), date_b = c(NA, "2016-01-08", NA, NA, NA, "2017-08-03",
NA, "2017-06-16", "2016-03-17"), c = c(NA, "house", NA, NA, NA,
"boat", NA, "boat", "boat")), class = "data.frame", row.names = c(NA,
-9L))