【问题标题】:how do I create a column from three columns by a condition?如何按条件从三列创建一列?
【发布时间】:2021-04-04 16:30:49
【问题描述】:

这可能有一个简单的解决方案,但我一直在努力解决这个问题,所以我很感激任何帮助。

我有一个名为“事件”的变量,它是二项式的,日期列表示事件发生的时间。我需要根据 date 和 date.2 创建一个变量,如果 date 和 date 缺少使用 date.2 值,则该变量将具有值。这是我最终结果的日期。请帮助我如何为其编写代码。

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"
), final_date = c("1/2/1999", "12/9/1999", "11/22/1999", "9/10/1999", 
"9/1/1999", "12/14/1999", "12/7/1999", "9/23/1999", "9/21/1999", 
"9/26/1999", "1/31/1999", "10/22/1999")), class = "data.frame", row.names = c(NA, -12L))

【问题讨论】:

标签: r variables dplyr data.table


【解决方案1】:

更新:我添加了第二个版本,如果列是日期,则应用此方法。

我将使用的解决方案是将数据转换为使用 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 日创建

【讨论】:

  • 效果很好。你知道如果两个日期列都是日期而不是字符。
  • 我在文章末尾添加了一个解释,以展示如何在日期对象上使用此方法。
猜你喜欢
  • 1970-01-01
  • 2022-11-07
  • 2021-10-09
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多