2014-04-03 51 views
6

我有一個特徵向量是這樣的:排序只有第一個字符,沿着一個特定的順序

stuff <- c("3S", "AH", "2I", "B4", "AL") 

而且我有一個「位置」載體就像這樣:

pos <- c("3", "B", "A", "2") 

我想使用最後一個矢量作爲參考,通過僅查看每個元素的第一個字符來排序第一個矢量;我不在乎第二個角色。也就是說,我想寫一個像specialsort(stuff, pos)這樣的函數,我的結果應該是c("3S", "B4", "AH", "AL", "2I")

這讓我瘋狂。 : -/

回答

7

你可以使用substring提取的stuffmatch的第一個字母到矢量與參考匹配:

# find index in pos 
i <- match(substring(stuff, 1, 1), pos) 

# order by pos 
o <- order(i) 

stuff[o] 
# [1] "3S" "B4" "AH" "AL" "2I" 
+1

這不是淫穢作爲一個班輪:'東西[順序(匹配(SUBSTR(東東,1 ,1),pos))]'' – thelatemail

+0

我真的很喜歡這兩個等價的解決方案。這兩個班輪對於像我這樣的R的新人非常有啓發性。等效的內容是美麗的。 :) – Celso

0

你可以用一個巧妙的做到這一點(如果我可以說我自己)操縱涉及變調factors

stuff[order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))] 

編輯,以添加一些解釋和簡化:

第一部分將只隔離你的東西向量的第一個字符。這是可以做到的:

> sapply(stuff,function(x)unlist(strsplit(x,''))[1]) 
3S AH 2I B4 AL 
"3" "A" "2" "B" "A" 

然後,您可以將此轉換爲因素,使用矢量pos爲水平:

> factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos) 
3S AH 2I B4 AL 
3 A 2 B A 
Levels: 3 B A 2 

最後,你可以從這些因素得到正確的順序:

> order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos)) 
[1] 1 4 2 5 3 

終點是簡單地把從原始stuff向量的一個子集:

> stuff[order(factor(sapply(stuff,function(x)unlist(strsplit(x,''))[1]),levels=pos))] 
[1] "3S" "B4" "AH" "AL" "2I" 
2

我幾乎可以肯定有一個簡單的方法來做到這一點,但這個工程:

specialsort <- function(stuff, pos) { 
    stuff.pos <- sapply(pos,function(x) which(substring(stuff,1,1) == x)) 
    stuff[unlist(stuff.pos)] 
} 

specialsort(stuff,pos) 

小心,但:這(和許多其他的解決方案)隱含假設POS向量是獨一無二的。

0

嘗試

stuff <- c("3S", "AH", "2I", "B4", "AL") 
pos <- c("3", "B", "A", "2") 

stuff.df = data.frame(stuff,pos = substr(stuff,1,1)) 
merge(data.frame(pos),stuff.df,sort = F) 

排序data.frame的 「POS」 列是你想要什麼

相關問題