![](/img/trans.png)
[英]How to sort a character vector where elements contain letters and numbers?
[英]sort character vector by multiple numbers
我有一個示例字符向量,其文件名如下:
> vector
[1] "1 Janu 1998.txt" "2 Feb. 1999.txt" "3 Marc 1999.txt"
[4] "2 February 1998.txt" "3 March. 1998.txt" "1 Jan 1999.txt"
我想按年和月(每個元素的第一個數字)對元素進行排序。 所以我這樣做:
> library(gtools)
> mixedsort(vector)
[1] "1 Janu 1998.txt" "1 Jan 1999.txt" "2 February 1998.txt"
[4] "2 Feb. 1999.txt" "3 Marc 1999.txt" "3 March. 1998.txt"
如果我使用sort(vector),則會得到相同的輸出。 我已經閱讀了幾個問題,但沒有找到具體的答案。 如果有人可以幫助我,我將不勝感激。 提前致謝。 我想得到以下輸出:
> output
[1] "1 Janu 1998.txt" "2 February 1998.txt" "3 March. 1998.txt"
[4] "1 Jan 1999.txt" "2 Feb. 1999.txt" "3 Marc 1999.txt"
我們可以做的:
v <- c("1 Jan 1998.txt", "2 Feb. 1999.txt", "3 March 1999.txt", "2 Feb 1998.txt", "3 March. 1998.txt","1 Jan 1999.txt")
v[order(as.Date(gsub("\\.", "", v), "%d %b %Ytxt"))];
#[1] "1 Jan 1998.txt" "2 Feb 1998.txt" "3 March. 1998.txt"
#[4] "1 Jan 1999.txt" "2 Feb. 1999.txt" "3 March 1999.txt"
說明:我們使用as.Date
將向量v
條目轉換為日期; 然后, order
將按日,月,年正確地訂購日期。
請注意,向量v
中的某些條目在一個月后包含一個句點; 不知道這是否是偶然的,但是gsub
命令可以解決這些問題。
通過以下方式也可以達到相同的目的
v[order(as.Date(gsub("(\\.|\\.txt)", "", v), "%d %b %Y"))];
為了解決月份名稱的非標准縮寫,我將定義一個自定義map
,將非標准名稱與標准名稱/縮寫鏈接。 然后,您可以執行以下操作:
v <- c("1 Janu 1998.txt", "2 Feb. 1999.txt", "3 Marc 1999.txt",
"2 February 1998.txt", "3 March. 1998.txt", "1 Jan 1999.txt")
# Define a map to map non-standard to standard month abbrev
map <- c(
Janu = "Jan",
Marc = "March")
# Separate dmy from filename and store in matrix
mat <- sapply(gsub("(\\.|\\.txt)", "", v), function(x)
unlist(strsplit(x, " ")))
# Replace non-standard month names
mat[2, ] <- ifelse(
!is.na(match(mat[2, ], names(map))),
map[match(mat[2, ], names(map))],
mat[2, ])
# Convert to Date then to numeric
dmy <- as.numeric(apply(mat, 2, function(x)
as.Date(paste0(x, collapse = "-"), format = "%d-%b-%Y")));
# Order according to dmy
v[order(dmy)]
#[1] "1 Janu 1998.txt" "2 February 1998.txt" "3 March. 1998.txt"
#[4] "1 Jan 1999.txt" "2 Feb. 1999.txt" "3 Marc 1999.txt"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.