【问题标题】:R, count non-missing dates in dataframe, return count as columnR,计算数据框中的非缺失日期,将计数作为列返回
【发布时间】:2021-06-18 12:58:05
【问题描述】:

我有这些数据:

Times<-structure(list(record_id = c(1, 2, 3, 4, 5, 6), Date1 = structure(c(17385, 
17959, 17267, 17204, 17063, 18436), class = "Date"), Date2 = structure(c(17689, 
18001, NA, 17255, 17076, 18471), class = "Date"), Date3 = structure(c(NA, 
NA, NA, NA, 18052, 18499), class = "Date")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

我想做的是计算每一行中存在的日期数(不丢失),并将其作为新列中的计数返回。

像这样:

实际数据框在每个目标列之间有更多列,因此我希望能够明确命名我正在计数的列。

有什么想法吗?

【问题讨论】:

    标签: r date


    【解决方案1】:

    我不确定您的第二个要求,但请检查这是否适合您:

    library(tidyr)
    library(dplyr)
    Times %>% pivot_longer(cols = starts_with('Date'), names_to = 'Date') %>% 
      group_by(record_id) %>% mutate(Count = sum(!is.na(value))) %>% 
        pivot_wider(id_cols = c(record_id,Count), names_from = Date, values_from = value )
    # A tibble: 6 x 5
    # Groups:   record_id [6]
      record_id Count Date1      Date2      Date3     
          <dbl> <int> <date>     <date>     <date>    
    1         1     2 2017-08-07 2018-06-07 NA        
    2         2     2 2019-03-04 2019-04-15 NA        
    3         3     1 2017-04-11 NA         NA        
    4         4     2 2017-02-07 2017-03-30 NA        
    5         5     3 2016-09-19 2016-10-02 2019-06-05
    6         6     3 2020-06-23 2020-07-28 2020-08-25
    

    【讨论】:

    • 效果很好,所有相关列都以“date_of_surgery_by.....”开头,谢谢!
    【解决方案2】:

    有了rowSums,你可以做到-

    cols <- c('Date1', 'Date2', 'Date3')
    Times$Count <- rowSums(!is.na(Times[cols]))
    Times
    
    # A tibble: 6 x 5
    #  record_id Date1      Date2      Date3      Count
    #      <dbl> <date>     <date>     <date>     <dbl>
    #1         1 2017-08-07 2018-06-07 NA             2
    #2         2 2019-03-04 2019-04-15 NA             2
    #3         3 2017-04-11 NA         NA             1
    #4         4 2017-02-07 2017-03-30 NA             2
    #5         5 2016-09-19 2016-10-02 2019-06-05     3
    #6         6 2020-06-23 2020-07-28 2020-08-25     3
    

    如果列有某种模式,您可以使用 dplyr select 辅助函数。

    library(dplyr)
    
    Times %>% mutate(Count = rowSums(!is.na(select(., starts_with('Date')))))
    

    【讨论】:

      【解决方案3】:

      另一个使用rowSums的基本R选项

      > Times$Count <- rowSums(!is.na(Times)) - 1
      
      > Times
      # A tibble: 6 x 5
        record_id Date1      Date2      Date3      Count
            <dbl> <date>     <date>     <date>     <dbl>
      1         1 2017-08-07 2018-06-07 NA             2
      2         2 2019-03-04 2019-04-15 NA             2
      3         3 2017-04-11 NA         NA             1
      4         4 2017-02-07 2017-03-30 NA             2
      5         5 2016-09-19 2016-10-02 2019-06-05     3
      6         6 2020-06-23 2020-07-28 2020-08-25     3
      

      【讨论】:

        【解决方案4】:

        我们可以使用

        library(dplyr)
        Times %>% 
           rowwise %>% 
           mutate(Count = sum(!is.na(c_across(starts_with('Date'))))) %>% 
           ungroup
        # A tibble: 6 x 5
          record_id Date1      Date2      Date3      Count
              <dbl> <date>     <date>     <date>     <int>
        1         1 2017-08-07 2018-06-07 NA             2
        2         2 2019-03-04 2019-04-15 NA             2
        3         3 2017-04-11 NA         NA             1
        4         4 2017-02-07 2017-03-30 NA             2
        5         5 2016-09-19 2016-10-02 2019-06-05     3
        6         6 2020-06-23 2020-07-28 2020-08-25     3
        
        

        【讨论】:

          猜你喜欢
          • 2020-05-13
          • 2017-06-20
          • 2020-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          • 1970-01-01
          相关资源
          最近更新 更多