2016-01-12 35 views
0
a = data.frame(x = c("fl", "kl", "po", "rt", "st"), a = runif(5), b = runif(5), c = runif(5), stringsAsFactors=FALSE) 

reference = c("po", "rt", "fl", "st", "kl") 

有data.frame a,它應該在x根據reference矢量進行排序。我將如何做到這一點?data.frame(NOT升序/降序)

回答

1

試試這個:

a$reference <- sapply(a$x, function(x) which(x == reference)) 
a[order(a$reference), ] 

通過這樣做可以避免保存到列中:

a[order(sapply(a$x, function(x) which(x == reference))), ] 

,如果你有x值的重複更多個列如下它的工作原理:

a2 <- rbind(a, a) 
a2[order(sapply(a2$x, function(x) which(x == reference))), ] 

輸出,如下圖所示:

x   a   b   c 
3 po 0.35188864 0.9611048 0.47784538 
8 po 0.35188864 0.9611048 0.47784538 
4 rt 0.40894400 0.7283944 0.56025326 
9 rt 0.40894400 0.7283944 0.56025326 
1 fl 0.04766363 0.9188573 0.05284394 
6 fl 0.04766363 0.9188573 0.05284394 
5 st 0.82095132 0.6863751 0.69826159 
10 st 0.82095132 0.6863751 0.69826159 
2 kl 0.70085309 0.2825283 0.39522013 
7 kl 0.70085309 0.2825283 0.39522013 
+3

只是要警告,這樣循環效率低下,而且數據量龐大。 – Roland

+0

'a [order(match(a $ x,reference)),]' –

7

使用match

match(reference, a$x) 
#[1] 3 4 1 5 2 

a[match(reference, a$x),] 
# x   a   b   c 
#3 po 0.11479400 0.85043472 0.1972569 
#4 rt 0.04886256 0.04916686 0.8341600 
#1 fl 0.57528688 0.31122035 0.1204271 
#5 st 0.77224495 0.29492122 0.9136916 
#2 kl 0.67683487 0.87516455 0.9612954 

一個解決方案解決重複值在data.frame關注(雖然以應具有代表性的問題):

a = data.frame(x = c("fl", "kl", "po", "rt", "st", "st"), a = runif(6), 
       b = runif(6), c = runif(6), stringsAsFactors=FALSE) 

a[order(factor(a$x, levels = reference)),] 
# x   a   b   c 
#3 po 0.43392816 0.0008970879 0.7282965 
#4 rt 0.74484047 0.4237432110 0.3593475 
#1 fl 0.69747570 0.0441067580 0.1477714 
#5 st 0.18866673 0.3650689835 0.4940101 
#6 st 0.93842498 0.4953243888 0.4318899 
#2 kl 0.09158319 0.6171634013 0.8798650 
+0

五個行這隻作品。如果你有更多的行重複值,它將無法正常工作。 – Gopala

+0

您的更新回答非常好,並且比上述解決方案更有效。謝謝! – Gopala