我无法重新安排数据框以组织团队成员从头到尾加入团队的日期。但是,我的数据需要跨行而不是列排列。
例如,我有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)
感谢您的帮助!
答案 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
,将日期存储为日期而不仅仅是字符。