我有一个数据帧,它有两个日期列(date_a和date_b(和一个因子列(c(df
现在,如果date_b不是NA(或者c不是NA(,我想用NA替换date_a中的所有值。在过去的几个小时里,我一直在尝试,我得到的最接近的代码是:
df<- df %>%
mutate(date_a = case_when(
is.na(c) == FALSE ~ NA
))
但这将用NA.替换整个列date_a
我希望有人能帮我。
谢谢!
您可以使用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在评论中指出的那样(,例如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))
这是一个带有is.na<-
的基本R一行
测试数据集是Ian Campbell答案中的数据集。
is.na(df$date_a) <- with(df, !(is.na(date_b) | is.na(c)))
df
# 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
您还必须添加其他条件:
df %>%
mutate(date_a = case_when(
is.na(c) ~ NA_character_,
TRUE ~ c
))