按日期重新排列列

Rearrange columns by date

我有一个包含 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"))
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>

使用按行操作,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>