更新:我添加了第二个版本,如果列是日期,则应用此方法。
我将使用的解决方案是将数据转换为使用 tibble 并使用 mutate 函数。使用 mutate 我们可以创建一个名为 date_final 的新列,它使用 ifelse 来检查 date == NA(使用 is.na() 函数检查)然后我们使用 date2 否则使用 date。
我在下面展示了这个例子
library(tidyverse)
df <- structure(list(X = c(11L, 6L, 12L, 8L, 9L, 10L, 1L, 3L, 5L, 7L,
2L, 4L), date = c("1/2/1999", NA, NA, NA, "9/1/1999", NA, "12/7/1999",
NA, NA, NA, "1/31/1999", NA), event = c(1L, 0L, 0L, 0L, 1L, 0L,
1L, 0L, 0L, 0L, 1L, 0L), date.2 = c("12/10/1999", "12/9/1999",
"11/22/1999", "9/10/1999", "10/25/1999", "12/14/1999", "9/17/1999",
"9/23/1999", "9/21/1999", "9/26/1999", "12/17/1999", "10/22/1999"
)), class = "data.frame", row.names = c(NA,
-12L))
# Use tibble for dataframe
df %>%
tibble %>%
# use ifelse(condition, true, false) which is equivalent to an if else loop over the rows
mutate(date_final = ifelse(is.na(date), date.2, date))
#> # A tibble: 12 x 5
#> X date event date.2 date_final
#> <int> <chr> <int> <chr> <chr>
#> 1 11 1/2/1999 1 12/10/1999 1/2/1999
#> 2 6 <NA> 0 12/9/1999 12/9/1999
#> 3 12 <NA> 0 11/22/1999 11/22/1999
#> 4 8 <NA> 0 9/10/1999 9/10/1999
#> 5 9 9/1/1999 1 10/25/1999 9/1/1999
#> 6 10 <NA> 0 12/14/1999 12/14/1999
#> 7 1 12/7/1999 1 9/17/1999 12/7/1999
#> 8 3 <NA> 0 9/23/1999 9/23/1999
#> 9 5 <NA> 0 9/21/1999 9/21/1999
#> 10 7 <NA> 0 9/26/1999 9/26/1999
#> 11 2 1/31/1999 1 12/17/1999 1/31/1999
#> 12 4 <NA> 0 10/22/1999 10/22/1999
由reprex package (v2.0.0) 于 2021-04-04 创建
如果由于误解而需要修改,或者您需要澄清任何功能,请告诉我。
为了将此方法应用于日期,我们可以应用相同的方法,但我们需要将 date_final 列从 dbl 转换为日期。我使用 lubridate 函数 as_date() 来执行此操作。
library(tidyverse)
library(lubridate)
df <- structure(list(X = c(11L, 6L, 12L, 8L, 9L, 10L, 1L, 3L, 5L, 7L,
2L, 4L), date = c("1/2/1999", NA, NA, NA, "9/1/1999", NA, "12/7/1999",
NA, NA, NA, "1/31/1999", NA), event = c(1L, 0L, 0L, 0L, 1L, 0L,
1L, 0L, 0L, 0L, 1L, 0L), date.2 = c("12/10/1999", "12/9/1999",
"11/22/1999", "9/10/1999", "10/25/1999", "12/14/1999", "9/17/1999",
"9/23/1999", "9/21/1999", "9/26/1999", "12/17/1999", "10/22/1999"
)), class = "data.frame", row.names = c(NA,
-12L))
df<- df %>%
tibble
df$date <- df$date %>% as.Date(format = "%m/%d/%y")
df$date.2 <- df$date.2 %>% as.Date(format = "%m/%d/%y")
df
#> # A tibble: 12 x 4
#> X date event date.2
#> <int> <date> <int> <date>
#> 1 11 2019-01-02 1 2019-12-10
#> 2 6 NA 0 2019-12-09
#> 3 12 NA 0 2019-11-22
#> 4 8 NA 0 2019-09-10
#> 5 9 2019-09-01 1 2019-10-25
#> 6 10 NA 0 2019-12-14
#> 7 1 2019-12-07 1 2019-09-17
#> 8 3 NA 0 2019-09-23
#> 9 5 NA 0 2019-09-21
#> 10 7 NA 0 2019-09-26
#> 11 2 2019-01-31 1 2019-12-17
#> 12 4 NA 0 2019-10-22
df <- df %>%
mutate(date_final = ifelse(is.na(date), date.2, date))
df$date_final <- df$date_final %>% as_date()
df
#> # A tibble: 12 x 5
#> X date event date.2 date_final
#> <int> <date> <int> <date> <date>
#> 1 11 2019-01-02 1 2019-12-10 2019-01-02
#> 2 6 NA 0 2019-12-09 2019-12-09
#> 3 12 NA 0 2019-11-22 2019-11-22
#> 4 8 NA 0 2019-09-10 2019-09-10
#> 5 9 2019-09-01 1 2019-10-25 2019-09-01
#> 6 10 NA 0 2019-12-14 2019-12-14
#> 7 1 2019-12-07 1 2019-09-17 2019-12-07
#> 8 3 NA 0 2019-09-23 2019-09-23
#> 9 5 NA 0 2019-09-21 2019-09-21
#> 10 7 NA 0 2019-09-26 2019-09-26
#> 11 2 2019-01-31 1 2019-12-17 2019-01-31
#> 12 4 NA 0 2019-10-22 2019-10-22
由reprex package (v2.0.0) 于 2021 年 4 月 4 日创建