我有一个脚本,它会产生如下的.csv输出:
但是,我强调了一个问题:以日期命名的列并不总是按正确的顺序排列。
我试图按名称对列进行排序,但这会影响必须始终在前三列中的前三列(retailer
,department
,type
)。发生这种情况是因为它们先按日期排序,然后按字符值排序。
如何重新排列列的顺序,以使前三列保持原样,并以正确的顺序获取日期?
更新:
我可以像这样对列进行排序,这是解决方案的第一部分:
sort(names(output))
在这种格式下,我现在需要将最后三列移到开头(对于生成的每个数据帧,它始终是相同的,所以会没事的。)
我该如何实现?
答案 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)