【问题标题】:Rearrange columns by date按日期重新排列列
【发布时间】:2021-10-14 10:14:42
【问题描述】:

我有一个包含 10 个日期列的数据集,但有些日期不按顺序排列。也就是说,变量date1 应该有最早的日期,date2 应该有第二个最早的日期,...,date10 应该有最晚的日期。我之前编写了两个嵌套的 for 循环并利用 Rfast 包中的 nth 函数来完成此操作,但我收到与 Rcpp 包相关的错误并且无法修复它。有没有更有效的方法来做这样的事情?

这是我的数据集示例。如您所见,第 5 次观察的日期不按顺序排列。 TloBankruptcy4FileDate 具有最早的日期,因此应将其值赋予TloBankruptcy1FileDate。下一个最早日期目前在TloBankruptcy3FileDate,但应该分配给TloBankruptcy2FileDate

我想要一个仍然有 10 行和 10 列的数据集,但每个变量的值都应该相应地分配。

我希望我是清楚的。谢谢!

structure(list(TloBankruptcy1FileDate = structure(c(NA, NA, NA, 
NA, 14992, 16764, NA, NA, NA, NA), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy2FileDate = structure(c(NA, NA, NA, NA, 14713, 
    10101, NA, NA, NA, NA), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy3FileDate = structure(c(NA, NA, NA, NA, 12892, 
    NA, NA, NA, NA, NA), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy4FileDate = structure(c(NA, NA, NA, NA, 9282, 
    NA, NA, NA, NA, NA), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy5FileDate = structure(c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy6FileDate = structure(c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy7FileDate = structure(c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy8FileDate = structure(c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy9FileDate = structure(c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), format.sas = "MMDDYY", class = "Date"), 
    TloBankruptcy10FileDate = structure(c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), format.sas = "MMDDYY", class = "Date")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r tidyverse data-wrangling


    【解决方案1】:
    df %>%
      rowid_to_column() %>%
      pivot_longer(-rowid) %>%
      group_by(rowid) %>%
      arrange(value) %>%
      mutate(name = str_c("f", row_number())) %>%
      pivot_wider() %>%
      ungroup() %>%
      arrange(rowid)
    #> # A tibble: 10 x 11
    #>    rowid f1         f2         f3         f4         f5     f6    
    #>    <int> <date>     <date>     <date>     <date>     <date> <date>
    #>  1     1 NA         NA         NA         NA         NA     NA    
    #>  2     2 NA         NA         NA         NA         NA     NA    
    #>  3     3 NA         NA         NA         NA         NA     NA    
    #>  4     4 NA         NA         NA         NA         NA     NA    
    #>  5     5 1995-06-01 2005-04-19 2010-04-14 2011-01-18 NA     NA    
    #>  6     6 1997-08-28 2015-11-25 NA         NA         NA     NA    
    #>  7     7 NA         NA         NA         NA         NA     NA    
    #>  8     8 NA         NA         NA         NA         NA     NA    
    #>  9     9 NA         NA         NA         NA         NA     NA    
    #> 10    10 NA         NA         NA         NA         NA     NA    
    #> # ... with 4 more variables: f7 <date>, f8 <date>, f9 <date>, f10 <date>
    

    【讨论】:

    • 抱歉不清楚。是否可以保留所有行和所有列?您的代码删除了未排列的行,但我实际上需要保留它们。也许唯一的方法是使用嵌套的 for 循环...
    • 您的编辑工作完美!非常感谢,非常感谢!
    【解决方案2】:

    使用按行操作,dapply(来自collapse)会更快

    library(collapse)
    library(dplyr)
    dapply(df1, MARGIN = 1, function(x) sort(x, na.last = TRUE)) %>%
          mutate(across(everything(), as.Date, origin = '1970-01-01'))
    # A tibble: 10 x 10
       TloBankruptcy1Fil… TloBankruptcy2Fi… TloBankruptcy3Fi… TloBankruptcy4Fi… TloBankruptcy5Fi… TloBankruptcy6Fi… TloBankruptcy7Fi… TloBankruptcy8Fi…
     * <date>             <date>            <date>            <date>            <date>            <date>            <date>            <date>           
     1 NA                 NA                NA                NA                NA                NA                NA                NA               
     2 NA                 NA                NA                NA                NA                NA                NA                NA               
     3 NA                 NA                NA                NA                NA                NA                NA                NA               
     4 NA                 NA                NA                NA                NA                NA                NA                NA               
     5 1995-06-01         2005-04-19        2010-04-14        2011-01-18        NA                NA                NA                NA               
     6 1997-08-28         2015-11-25        NA                NA                NA                NA                NA                NA               
     7 NA                 NA                NA                NA                NA                NA                NA                NA               
     8 NA                 NA                NA                NA                NA                NA                NA                NA               
     9 NA                 NA                NA                NA                NA                NA                NA                NA               
    10 NA                 NA                NA                NA                NA                NA                NA                NA               
    # … with 2 more variables: TloBankruptcy9FileDate <date>, TloBankruptcy10FileDate <date>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多