R 如何根据特定列的日期值对其重新排序?
我有一个生成.csv输出的脚本,如下所示: 但是,我强调了一个问题:日期列的顺序并不总是正确的 我尝试按名称对列进行排序,但这会影响前三列(R 如何根据特定列的日期值对其重新排序?,r,sorting,R,Sorting,我有一个生成.csv输出的脚本,如下所示: 但是,我强调了一个问题:日期列的顺序并不总是正确的 我尝试按名称对列进行排序,但这会影响前三列(零售商,部门,类型),它们必须始终位于前三列中。这是因为它们首先按日期排序,然后按字符值排序 如何对列进行重新排序,使前三列保持原样,并以正确的顺序获取日期 更新: 我可以像这样对列进行排序,这是解决方案的第一部分: sort(names(output)) 在这种格式中,我现在需要将最后三列移到开头(对于生成的每个数据帧,这将始终是相同的,这样就可以了)
零售商
,部门
,类型
),它们必须始终位于前三列中。这是因为它们首先按日期排序,然后按字符值排序
如何对列进行重新排序,使前三列保持原样,并以正确的顺序获取日期
更新:
我可以像这样对列进行排序,这是解决方案的第一部分:
sort(names(output))
在这种格式中,我现在需要将最后三列移到开头(对于生成的每个数据帧,这将始终是相同的,这样就可以了)
如何实现这一点?一个选项是将其转换为
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
#使用模式获取列索引
嗨!你试过只从第四列排序吗?这是有道理的,但不起作用;列的顺序仍然相同(不正确),现在除了现有列之外,还会生成重复列(即2019-01-12.1
)。(我也不能分享我的脚本,因为它超过200行。)@MusTheDataGuy。你能检查一下“nm1”和“nm2”的输出吗。我认为一定是一些简单的错误导致了这个问题。您确定列名是唯一的吗?我已选中,并且nm1
和nm2
共享相同的日期值和x
值;然而,nm2
也有零售商
、部门
和类型
,而nm1
没有。“有什么好主意吗?”穆斯赫达盖伊说。"nm2"有错。现在检查它现在应该可以工作了,因为“nm2”是通过使用setdiff的setdiff创建的,setdiff创建了列的副本
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)