我有一個資料標簽串列作為字串,很像這樣:
data <- c("ABCD 2", "ABCD 3", "WXYZ 1", "WXYZ 5", "WXYZ 3", "WXYZ 4", "ABCD 4", "ABCD 11")
請注意,有時會丟失一些數字,包括“1”。一個正常的那種,當然,放ABCD了之前的標簽WXYZ標簽,然后放ABCD 11之前ABCD 2。
我可以輕松解決編號問題gtools::mixedsort。但是,出于特定問題的背景關系的原因,我也希望WXYZ標簽位于標簽之前ABCD。
例如,當data上面按照我的需要排序時,它應該是這樣的:
dataSorted <- c("WXYZ 1", "WXYZ 3", "WXYZ 4", "WXYZ 5", "ABCD 2", "ABCD 3", "ABCD 4", "ABCD 11")
謝天謝地,我現在只需要處理這兩種型別的標簽,但我想我應該尋求一個通用的解決方案。有沒有辦法gtools::mixedsort做反向字母但正常的數字排序?如果我設定,decreasing = TRUE那么它也會反轉所有的數字順序。
現在我只是使用一個串列來強制排序,這不僅不雅,而且由于標簽上的數字沒有理論上的上限,它最終也會被打破。
uj5u.com熱心網友回復:
我們可以分別提取數字和非數字字符,然后做order轉換后factor與levels對非數字的部分規定
data[order(factor(sub("\\s \\d ", "", data),
levels = c("WXYZ", "ABCD")), as.integer(sub("\\S \\s ", "", data)))]
-輸出
[1] "WXYZ 1" "WXYZ 3" "WXYZ 4" "WXYZ 5"
[5] "ABCD 2" "ABCD 3" "ABCD 4" "ABCD 11"
uj5u.com熱心網友回復:
這無需任何預定義或手動輸入資料即可作業。唯一的先決條件是第一項必須是字母字串,第二項必須是數字(如果缺少數字,則引入 NA)。
首先,將字串按 分割space,然后按字母和組內的數字進行分組。然后必須將兩者重新組合在一起。
# split
dat <- setNames( data.frame( t(data.frame( strsplit( data, " " ) )[1,]),
as.numeric( data.frame( strsplit( data, " " ) )[2,]) ), c("A","B") )
# A B
#c..ABCD....2.. ABCD 2
#c..ABCD....3.. ABCD 3
#c..WXYZ....1.. WXYZ 1
#c..WXYZ....5.. WXYZ 5
#c..WXYZ....3.. WXYZ 3
#c..WXYZ....4.. WXYZ 4
#c..ABCD....4.. ABCD 4
#c..ABCD....11.. ABCD 11
# group and order
dat_agr <- aggregate( B ~ A, dat, na.action=na.pass,
function(x)sort(x, na.last=T), simplify=F )
dat_ord <- dat_agr[order(dat_agr[,"A"], decreasing=T),]
# A B
#2 WXYZ 1, 3, 4, 5
#1 ABCD 2, 3, 4, 11
# bring back together
unlist(lapply( dat_ord$A, function(x) sapply(
dat_ord[grep(x, dat_ord$A),"B"], function(y) paste(x,y) ) ))
[1] "WXYZ 1" "WXYZ 3" "WXYZ 4" "WXYZ 5" "ABCD 2" "ABCD 3" "ABCD 4"
[8] "ABCD 11"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/363649.html
上一篇:F#int串列與單位串列
下一篇:使用constchar來組織字串
