r-根据条件突变为NA



我有一个数据帧,它有两个日期列(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
))

相关内容

  • 没有找到相关文章

最新更新