【问题标题】:R - Sorting DF across Rows by Date (transform, sort) & converting back to DF without losing changesR - 按日期跨行对 DF 进行排序(转换、排序)并转换回 DF 而不会丢失更改
【发布时间】:2018-07-02 23:08:31
【问题描述】:

我无法重新安排我的数据框来组织团队成员从头到尾加入团队的日期。但是,我的数据需要跨行而不是跨列排列。

例如,我有 6 列,每列包含团队成员加入团队的日期。一个团队按行分布在 6 列中。但是,原始数据可能会显示团队成员 3 在团队成员 1 之前加入。

团队规模不同,最少 1 人,最多 6 人。在下面的示例中,第一队是第 1 行的两个人(e1,e2),第二个队是第 2 行的三个人(e1,e2,e3),依此类推。

我的原始数据示例:

e1 <- c("2015-09-21", "2014-01-25", "2014-11-06")
   e2 <- c("2015-10-13", "2014-01-25", "2014-11-06")
   e3 <- c(NA, "2014-01-25", "2014-09-24")
   e4 <- c(NA, NA, NA)
   e5 <- c(NA, NA, NA)
   e6 <- c(NA, NA, NA)
   reg_dates_df <- data.frame (e1, e2, e3, e4, e5, e6)

为了解决这个问题,我尝试了以下代码:

reg_dates_list <- t(apply(reg_dates_df, 1, sort))
reg_dates_list <- t(reg_dates_list)

reg_dates_ordered <- rbindlist(lapply(reg_dates_list, as.data.frame.list),    fill = TRUE)

不幸的是,它以相同的方式返回数据帧,而不是保持使用 sort 命令产生的固定顺序。我不确定如何修复矩阵中的新排序向量,以便在转换回 DF 时它们不会变回原来的位置。

我希望数据框看起来像这样(请参阅第三行的更改),其中包含第一个加入的人的日期在 e1 中,等等。

e1 <- c("2015-09-21", "2014-01-25", "2014-09-24")
e2 <- c("2015-10-13", "2014-01-25", "2014-11-06")
e3 <- c(NA, "2014-01-25", "2014-11-06")
e4 <- c(NA, NA, NA)
e5 <- c(NA, NA, NA)
e6 <- c(NA, NA, NA)
reg_dates_df_ordered2 <- data.frame (e1, e2, e3, e4, e5, e6)

感谢您的帮助!

【问题讨论】:

    标签: r sorting row transform


    【解决方案1】:

    如果是如下的字符矩阵,可能会更简单:

    t(apply(as.matrix(reg_dates_df), 1, sort, na.last=TRUE))
    

    【讨论】:

      【解决方案2】:

      数据框旨在对列进行操作。你构建的reg_dates_ordered数据框是混合了因素和逻辑值的,以后可能会给你带来惊喜。

      > summary(reg_dates_df)
                e1             e2             e3       e4             e5         
       2014-01-25:1   2014-01-25:1   2014-01-25:1   Mode:logical   Mode:logical  
       2014-11-06:1   2014-11-06:1   2014-09-24:1   NA's:3         NA's:3        
       2015-09-21:1   2015-10-13:1   NA's      :1                                
          e6         
       Mode:logical  
       NA's:3        
      

      正如 chinsoon12 所建议的,如果您真的想按行组织数据,matrixcharacter 值可能更适合您的需求。如果您想坚持使用数据框,还请注意 stringsAsFactors 选项以确保您的日期保持字符格式。

      对于在 R 中完成的工作,真的有必要按行组织数据吗?如果您需要按行导出最终结果,那么您可以按列工作,并在最后一刻转置。然后,在 R 中,您的数据框将如下所示:

      t1 <- c("2015-09-21", "2015-10-13", NA, NA, NA, NA)
      t2 <- c("2014-01-25", "2014-01-25", "2014-01-25", NA, NA, NA)
      t3 <- c("2014-11-06", "2014-11-06", "2014-09-24", NA, NA, NA)
      reg_dates_df4 <- data.frame(t1, t2, t3, stringsAsFactors = FALSE)
      
      > reg_dates_df4
                t1         t2         t3
      1 2015-09-21 2014-01-25 2014-11-06
      2 2015-10-13 2014-01-25 2014-11-06
      3       <NA> 2014-01-25 2014-09-24
      4       <NA>       <NA>       <NA>
      5       <NA>       <NA>       <NA>
      6       <NA>       <NA>       <NA>
      

      您可以使用lapply 循环访问它们。

      > as.data.frame(lapply(reg_dates_df4, sort, na.last=T), stringsAsFactors=F)
                t1         t2         t3
      1 2015-09-21 2014-01-25 2014-09-24
      2 2015-10-13 2014-01-25 2014-11-06
      3       <NA> 2014-01-25 2014-11-06
      4       <NA>       <NA>       <NA>
      5       <NA>       <NA>       <NA>
      6       <NA>       <NA>       <NA>
      

      如果您厌倦了stringsAsFactors,请查看?as.POSIXct,例如,将日期存储为日期,而不仅仅是字符。

      【讨论】:

        猜你喜欢
        • 2021-11-03
        • 2022-08-19
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多