将列(按时间)从小到大排序

问题描述 投票:0回答:2

我有这个数据帧(以 1 分钟频率),其中列代表时间戳。我想从早到晚对这些列进行排序(例如,从 00:00 到 23:59)。现在从 06:43 开始到 06:42。

    > head(data3)
# A tibble: 6 × 1,440
  `06:43` `06:44` `06:45` `06:46` `06:47` `06:48` `06:49` `06:50` `06:51` `06:52`
  <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
1 3       2       2       3       3       2       1       0       1       1      
2 7       6       6       6       6       6       6       5       5       6      
3 10      9       9       7       5       3       M       M       M       M      
4 M       M       M       M       M       M       M       M       M       M      

一开始对于小列名的列表,我想到了这种常用的方式

col_order <- c("00:00", "00:01", ..., "23:59") # write down all columns
data3 <- data3[, col_order]
data3

但显然,写下所有的列名称(1440 列)太多了,而且看起来很“愚蠢”。

有没有办法在 R 中做到这一点?好心提醒。谢谢你。

r sorting time time-series timestamp
2个回答
1
投票

这是可重复的数据:

df <- structure(list("06:43" = c("3", "7", "10", "M"), "06:44" = c("2", "6", "9", "M"), "12:45" = c("2", "6", "9", "M"), "06:46" = c("3", "6", "7", "M"), "06:47" = c("3", "6", "5", "M"), "06:48" = c("2", "6", "3", "M"), "06:49" = c("1", "6", "M", "M"), "06:50" = c("0", "5", "M", "M"), "06:51" = c("1", "5", "M", "M"), "06:42" = c("1", "6", "M", "M")), class = "data.frame", row.names = c("1", "2", "3", "4"))
df
#   06:43 06:44 12:45 06:46 06:47 06:48 06:49 06:50 06:51 06:42
# 1     3     2     2     3     3     2     1     0     1     1
# 2     7     6     6     6     6     6     6     5     5     6
# 3    10     9     9     7     5     3     M     M     M     M
# 4     M     M     M     M     M     M     M     M     M     M

从这里开始,可以直接对列名称进行排序:

df[,sort(names(df))]
#   06:42 06:43 06:44 06:46 06:47 06:48 06:49 06:50 06:51 12:45
# 1     1     3     2     3     3     2     1     0     1     2
# 2     6     7     6     6     6     6     6     5     5     6
# 3     M    10     9     7     5     3     M     M     M     9
# 4     M     M     M     M     M     M     M     M     M     M

请注意,如果根据您的评论,您有一个名为

"6:42"
且没有前导零的列,那么这将破坏字母排序。在这种情况下,那么也许:

names(df)[10] <- "6:42" # just to show it, don't do this
df[,order(as.numeric(sub(":", ".", names(df))))]
#   6:42 06:43 06:44 06:46 06:47 06:48 06:49 06:50 06:51 12:45
# 1    1     3     2     3     3     2     1     0     1     2
# 2    6     7     6     6     6     6     6     5     5     6
# 3    M    10     9     7     5     3     M     M     M     9
# 4    M     M     M     M     M     M     M     M     M     M

0
投票

我们可以

sub
去掉冒号并强制
as.integer
,这对于所讨论的拼写错误是稳健的,无需前导零。

> df[order(as.integer(sub(':', '', names(df))))]
  06:42 06:43 6:44 06:46 06:47 06:48 06:49 06:50 06:51 12:45
1     1     3    2     3     3     2     1     0     1     2
2     6     7    6     6     6     6     6     5     5     6
3     M    10    9     7     5     3     M     M     M     9
4     M     M    M     M     M     M     M     M     M     M

数据:

> dput(df)
structure(list(`06:43` = c("3", "7", "10", "M"), `6:44` = c("2", 
"6", "9", "M"), `12:45` = c("2", "6", "9", "M"), `06:46` = c("3", 
"6", "7", "M"), `06:47` = c("3", "6", "5", "M"), `06:48` = c("2", 
"6", "3", "M"), `06:49` = c("1", "6", "M", "M"), `06:50` = c("0", 
"5", "M", "M"), `06:51` = c("1", "5", "M", "M"), `06:42` = c("1", 
"6", "M", "M")), class = "data.frame", row.names = c("1", "2", 
"3", "4"))
© www.soinside.com 2019 - 2024. All rights reserved.