如何根据特定列的日期值对其重新排序?

时间:2019-01-29 11:15:13

标签: r sorting

我有一个脚本,它会产生如下的.csv输出:

enter image description here

但是,我强调了一个问题:以日期命名的列并不总是按正确的顺序排列。

我试图按名称对列进行排序,但这会影响必须始终在前三列中的前三列(retailerdepartmenttype)。发生这种情况是因为它们先按日期排序,然后按字符值排序。

如何重新排列列的顺序,以使前三列保持原样,并以正确的顺序获取日期?

更新:

我可以像这样对列进行排序,这是解决方案的第一部分:

sort(names(output))

在这种格式下,我现在需要将最后三列移到开头(对于生成的每个数据帧,它始终是相同的,所以会没事的。)

我该如何实现?

1 个答案:

答案 0 :(得分:1)

一种选择是转换为Date类,然后对其进行排序

# using a pattern, get the column index
i1 <- grep("^\\d{2}", names(df1))
# sort the extracted the column names after converting to 'Date' class
nm1 <-  names(df1)[i1][order(as.Date(names(df1)[i1], '%d/%m/%Y'))]
# get the names of the other columns
nm2 <- setdiff(names(df1), names(df1)[i1])
# concatenate the columns
df2 <- df1[c(nm2, nm1)]
df2
#    retailer department      type 22/03/2015 15/01/2017 25/07/2018 11/01/2019 12/01/2019
#1        1          a completed          4          1          2          4          1
#2        2          b completed          1          1          2          3          4
#3        3          c completed          5          1          2          2          3

数据

df1 <- data.frame(retailer = 1:3, department = letters[1:3], 
 type = 'completed', `11/01/2019` = c(4, 3, 2),
 `12/01/2019` = c(1, 4, 3), `15/01/2017` = 1,
 `25/07/2018` = 2, `22/03/2015` = c(4, 1, 5), check.names = FALSE)