我的数据框Time
中有df
列,其类型为字符。
在Arrange()
包中使用dplyr
后,我的Time
列的排序方式如下:
D1W12001
D1W12002
...
D1W22001
D1W22002
...
D2W12001
D2W12002
...
但我需要按时间顺序排序为:
D1W12001
D2W12001
D3W12001
...
实现这一目标的最佳方法是什么? 我可以在相反的方向(从左到右)对字符串进行排序吗? 或者我是否需要先将我的列转换为日期时间对象?用于此的最佳软件包是什么?
更新
我想我没有很好地提出这个问题。让我澄清一下。
让我们假设时间是随机的,格式为DxWxYear,其中D是日,W是星期,年是年。 一周有5天,一年有52周,2001年到2011年有几年。
这些"次"是字符串。
所以我的无序数据可能如下:
D4W72002
D2W32009
D5w372001
D2w152003
...
对于许多行,继续这样..
现在我需要按时间顺序排列,例如:
D1W12001
D2W12001
D3W12001
D4W12001
D5W12001
D1W22001
D2W22001
...
D4W522011
D5W522011
现在我怎样才能订购我的时代?
执行order()
或Arrange()
将它们排序为字符串,因此它会从右侧递增它们,所以它看起来如下所示:
D1W12001
D1W12002
D1W12003
D1W12004
D1W12005
...
这不是我需要的。
答案 0 :(得分:0)
使用日期格式可能有办法做到这一点,但我没有看到。我尝试使用strftime()
,但似乎一年中一周的格式预计会领先零。我研究了在lubridate包中使用parse_date_time()
,但是工作日的格式是期望值0-6而不是1-7。
所以,我使用substring()
和strsplit()
来修剪年份,然后将剩余部分分成两部分。
nc <- nchar(df$Time)
year <- substring(df$Time, nc-3, nc)
dw <- strsplit(substring(df$Time, 2, nc-4), "W")
day <- as.numeric(sapply(dw, "[", 1))
week <- as.numeric(sapply(dw, "[", 2))
ord <- order(year, week, day)
df[ord, ]
答案 1 :(得分:-1)
我写了一个反向函数来改变字符串的顺序,这样正常的sort()
函数就可以了。
stringReverse <- function(x) {
d <- substring(x$Time, 1, 2)
w <- substring(x$Time, 3, 4)
y <- substring(x$Time, 5, 8)
return(paste(y,w,d,sep=""))
}
调用该函数替换Time
中的df
列:
df$Time <- stringReplace(df)
现在,我可以使用arrange()
对我进行排序。
在使用不同的反向函数进行排列后,可以将Time
字符串恢复为原来的字符串。