R - 按日期排序DF(转换,排序)&转换回DF而不会丢失更改

时间:2018-01-24 01:18:57

标签: r sorting row transform

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

例如,我有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)

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

如果它是一个字符矩阵可能更容易,如下所示:

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

答案 1 :(得分: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所建议的那样,如果您真的想按行整理数据,matrix character值可能会更符合您的需求。如果您想坚持使用数据框,请同时注意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,将日期存储为日期而不仅仅是字符。