Câu trả lời:
Đây là một lớp lót ...
y[sort(order(y)[x])]
[sửa:] Điều này được chia nhỏ như sau:
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
x
và y
. x <- c(1,4,2); y <- c(1,2,4)
ví dụ.
cái này thì sao
x[order(match(x,y))]
Bạn có thể chuyển đổi x
thành một yếu tố có thứ tự:
x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Rõ ràng, việc thay đổi các số của bạn thành các yếu tố có thể thay đổi hoàn toàn cách phản ứng của mã ở phía dưới x
. Nhưng vì bạn không cung cấp cho chúng tôi bất kỳ bối cảnh nào về những gì xảy ra tiếp theo, tôi nghĩ tôi sẽ đề xuất điều này như một lựa chọn.
x
không nằm trong vector sắp xếp y
với thay đổi nhỏ: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))))))
Làm thế nào về?:
rep(y,table(x)[as.character(y)])
(Ian có lẽ vẫn tốt hơn)
Trong trường hợp bạn cần đặt hàng trên "y" cho dù đó là số hay ký tự:
x[order(ordered(x, levels = y))]
4 4 4 2 2 1 3 3 3
Theo các bước:
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
[ Chỉnh sửa: Rõ ràng Ian có cách tiếp cận đúng, nhưng tôi sẽ để lại điều này cho hậu thế.]
Bạn có thể làm điều này mà không cần vòng lặp bằng cách lập chỉ mục trên vectơ y của bạn. Thêm một giá trị số tăng dần vào y và hợp nhất chúng:
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))) }
Kết quả trong z: 4 4 4 2 2 1 3 3 3
Các bước quan trọng:
for (i in y) - Vòng lặp qua các phần tử quan tâm.
z <- c (z, ...) - Lần lượt nối từng biểu thức con
rep (i, sum (x == i)) - Lặp lại i (phần tử hiện tại được quan tâm) sum (x == i) lần (số lần chúng tôi tìm thấy i trong x).