r语言 - 自定义排序小时和天数



我有包含小时和天的文本。我想按逻辑顺序对它们进行排序 - 小时应该首先出现,然后是天。

Time <- c("10 days ago", "9 days ago", "4 days ago", "2 days ago", "3 days ago", 
"6 days ago", "10 hours ago", "8 days ago", "5 days ago", "12 days ago", 
"8 hours ago")

这是一个基本的R方法:

Time[order(match(sub('.*(hours|days).*', '\1', Time), c('hours', 'days')), 
as.numeric(gsub('\D', '', Time)))]
# [1] "8 hours ago"  "10 hours ago" "2 days ago"   "3 days ago"  
# [5] "4 days ago"   "5 days ago"   "6 days ago"   "8 days ago"  
# [9] "9 days ago"   "10 days ago"  "12 days ago" 

我们使用两个变量对数据进行排序。

  1. 按小时和天。

    subTime中提取"小时"或"天",我们使用match生成 1/2 作为输出。 1 给小时,2 给天。

  2. 按数字。

    我们从Time中删除所有不是数字的内容并将其转换为数字。

这些只使用 R 的基数。

1)它创建一个包含三个字段的3列数据框(V1是数字,V2hourdayV3ago),然后按降序和V2内按升序V1V2执行适当的排序。order生成一个应用于Time的索引。

o <- with(read.table(text = Time), order(-xtfrm(V2), V1))
Time[o]

给:

[1] "8 hours ago"  "10 hours ago" "2 days ago"   "3 days ago"   "4 days ago"  
[6] "5 days ago"   "6 days ago"   "8 days ago"   "9 days ago"   "10 days ago" 
[11] "12 days ago" 

2) 这是 (1) 的变体,由于 TRUE 在 FALSE 之后排序,因此有效:

o <- with(read.table(text = Time), order(V2 == "days", V1))
Time[o]

3)这个也使用了 TRUE 在 FALSE 之后排序的事实。

o <- order(grepl("days", Time), as.numeric(sub(" .*", "", Time))
Time[o]

相关内容

  • 没有找到相关文章

最新更新