2014-04-03 13 views
6

Tôi có một vector nhân vật như thế này:Sorting chỉ ký tự đầu tiên, cùng một thứ tự cụ thể

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

Và tôi có một "vị trí" vector như thế này:

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

Tôi muốn sử dụng vector cuối cùng làm tham chiếu để sắp xếp cái đầu tiên bằng cách chỉ nhìn vào ký tự đầu tiên của mỗi phần tử; Tôi không quan tâm đến nhân vật thứ hai. Đó là, tôi muốn viết và một chức năng như specialsort(stuff, pos) và kết quả của tôi phải là c("3S", "B4", "AH", "AL", "2I").

Điều đó khiến tôi phát điên. : -/

Trả lời

7

Bạn có thể sử dụng substring để trích xuất các chữ cái đầu tiên của stuffmatch để phù hợp với vector của bạn chống lại các tài liệu tham khảo:

# 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

Đó không phải là khiêu dâm như một liner: 'thứ [trật tự (trận đấu (substr (thứ 1 , 1), pos))] ' – thelatemail

+0

Tôi thực sự yêu hai giải pháp tương đương đó. Hai lót là rất instructive cho một người mới đến R như tôi. Các oneliner tương đương là đẹp. :) – Celso

0

Bạn có thể làm điều đó với một thông minh (nếu tôi có thể nói bản thân mình) thao tác liên quan đến việc chuyển vị để factors:

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

đã chỉnh sửa để thêm một số giải thích và đơn giản hóa:

012.

Phần đầu tiên sẽ là cô lập chỉ ký tự đầu tiên của vectơ công cụ của bạn. Điều này có thể được thực hiện với:

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

Sau đó, bạn có thể chuyển đổi này để các yếu tố, sử dụng vector của bạn pos như mức độ:

> 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 

Cuối cùng, bạn có thể nhận được theo thứ tự đúng từ các yếu tố:

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

Kết thúc chỉ đơn giản là lấy một tập hợp con từ stuff vector gốc của bạn:

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

Tôi gần như chắc chắn có một cách đơn giản hơn để làm điều đó nhưng công trình này:

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

specialsort(stuff,pos) 

cẩn thận mặc dù: Đây (và nhiều giải pháp khác) ngầm giả định rằng các vector pos là duy nhất.

0

thử

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) 

Các "pos" cột của data.frame sắp xếp là những gì bạn muốn

Các vấn đề liên quan