Yanıtlar:
İşte tek satırlık ...
y[sort(order(y)[x])]
[edit:] Bu, aşağıdaki gibi ayrılır:
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
xVe üzerindeki pek çok basit varyasyon için başarısız olur y. x <- c(1,4,2); y <- c(1,2,4)Örneğin.
Peki ya bu
x[order(match(x,y))]
xSıralı bir faktöre dönüştürebilirsiniz :
x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Açıkçası, sayılarınızı faktörlere dönüştürmek, aşağı akış kodunun tepki verme şeklini kökten değiştirebilir x. Ama bize bundan sonra ne olacağı konusunda herhangi bir bağlam vermediğin için, bunu bir seçenek olarak önereceğimi düşündüm.
xsıralama vektöründe yküçük bir değişiklikle değerler olduğunda da çalışın :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))))))
Peki ya ?:
rep(y,table(x)[as.character(y)])
(Ian muhtemelen daha iyi)
Sayı veya karakter olsun, "y" üzerinden sipariş almanız gerektiğinde:
x[order(ordered(x, levels = y))]
4 4 4 2 2 1 3 3 3
Adımlarla:
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
[ Düzenleme: Açıkça Ian'ın doğru yaklaşımı var, ancak bunu gelecek nesillere bırakacağım.]
Bunu y vektörünüzü indeksleyerek döngüler olmadan yapabilirsiniz. Y'ye artan bir sayısal değer ekleyin ve bunları birleştirin:
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
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'deki sonuç: 4 4 4 2 2 1 3 3 3
Önemli adımlar:
for (i in y) - İlgili öğelerin üzerinde döngüler.
z <- c (z, ...) - Sırayla her alt ifadeyi birleştirir
rep (i, sum (x == i)) - i'yi (ilgilenilen mevcut öğe) toplamını (x == i) kez (x'te i'yi bulduğumuz sayı) tekrarlar.
Ayrıca , aşağıdaki gibi sqldfbir joinişlevle kullanabilir ve yapabilirsiniz sql:
library(sqldf)
x <- data.frame(x = c(2, 2, 3, 4, 1, 4, 4, 3, 3))
y <- data.frame(y = c(4, 2, 1, 3))
result <- sqldf("SELECT x.x FROM y JOIN x on y.y = x.x")
ordered_x <- result[[1]]