我有包含小时和天的文本。我想按逻辑顺序对它们进行排序 - 小时应该首先出现,然后是天。
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"
我们使用两个变量对数据进行排序。
按小时和天。
sub
从Time
中提取"小时"或"天",我们使用match
生成 1/2 作为输出。 1 给小时,2 给天。按数字。
我们从
Time
中删除所有不是数字的内容并将其转换为数字。
这些只使用 R 的基数。
1)它创建一个包含三个字段的3列数据框(V1
是数字,V2
是hour
或day
,V3
是ago
),然后按降序和V2
内按升序V1
V2
执行适当的排序。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]