2009-10-14 73 views

回答

59

這裏是一個班輪...

y[sort(order(y)[x])] 

[編輯:]這個分解如下:

order(y)    #We want to sort by y, so order() gives us the sorting order 
order(y)[x]   #looks up the sorting order for each x 
sort(order(y)[x]) #sorts by that order 
y[sort(order(y)[x])] #converts orders back to numbers from orders 
+0

這很簡潔,但我很難弄清楚發生了什麼。你能詳細說明一下嗎? – 2009-10-14 22:14:41

+0

謝謝! order()讓我感到困惑 - 似乎只是任意重新排列數字,但那只是一個1-4的序列的人造物。 – 2009-10-15 04:04:51

+2

這很漂亮,並且很好地理解了R的內置插件。 +1 – Godeke 2009-10-15 15:21:24

-3

環比y和移動所有匹配的值X到正確的位置。

0
x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) 
y <- c(4, 2, 1, 3) 
for(i in y) { z <- c(z, rep(i, sum(x==i))) } 

結果在Z:4 4 4 2 2 1 3 3 3

的重要步驟:

  1. 爲(i的Y) - 環在所關注的元素。

  2. ž< - C(Z,...) - 串接每個子表達式反過來

  3. 代表(ⅰ,總和(x == i))的 - 重複I(電流的關注元件)sum(x == i)次(我們在x中找到的次數)。

3

你可以轉換成x有序因素:

x.factor <- factor(x, levels = y, ordered=TRUE) 
sort(x) 
sort(x.factor) 

顯然,改變你的號碼爲的因素可以從根本上改變代碼的方式下游反應x。但既然你沒有給我們任何關於接下來會發生什麼的背景,我想我會建議這是一個選項。

+0

這應該是最好的答案,因爲它適用於非整數情況;或者當'x'中的值不在具有輕微變化的排序矢量'y'中時也工作:'x < - c(2,2,3,4,1,4,4,3,3,6); y < - c(4,2,1,3); as.numeric(as.character(sort(factor(x,unique(c(y,x))))))' – rawr 2017-04-11 23:52:52

1

[編輯:顯然伊恩有正確的方法,但我會離開這個爲後人]

您可以通過索引你的y向量做這沒有循環。遞增的數值添加到y和合並它們:

y <- data.frame(index=1:length(y), x=y) 
x <- data.frame(x=x) 
x <- merge(x,y) 
x <- x[order(x$index),"x"] 
x 
[1] 4 4 4 2 2 1 3 3 3 
2

怎麼樣?:

rep(y,table(x)[as.character(y)]) 

(Ian的可能仍然是更好)

111

這個怎麼樣

x[order(match(x,y))] 
+18

這是非常好的,比接受的答案恕我直言,因爲它更一般。 – fmark 2012-05-21 10:15:37

+2

我會盡可能地說這應該在GNU-R的基礎上。 – 2016-10-17 17:00:27

+0

這真的很有趣,我經常遇到這種情況,並最終重複出現在這一行的答案中。去展示SO如何能夠幫助最簡單的事情哈哈 – 2017-07-31 16:37:16

0

如果您需要在「Y」不管得到命令,如果它的數字或字符:

x[order(ordered(x, levels = y))] 
4 4 4 2 2 1 3 3 3 

通過以下步驟:

a <- ordered(x, levels = y) # Create ordered factor from "x" upon order in "y". 
[1] 2 2 3 4 1 4 4 3 3 
Levels: 4 < 2 < 1 < 3 

b <- order(a) # Define "x" order that match to order in "y". 
[1] 4 6 7 1 2 5 3 8 9 

x[b] # Reorder "x" according to order in "y". 
[1] 4 4 4 2 2 1 3 3 3 
相關問題