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升序/降序)
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升序/降序)
試試這個:
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
使用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
只是要警告,這樣循環效率低下,而且數據量龐大。 – Roland
'a [order(match(a $ x,reference)),]' –