2017-10-28 118 views
1

我想根據xy數據幀的列中值的遞增順序對xy1數據幀的列中的值進行排序。按照另一個數據幀中值的順序對數據幀中的值進行排序R

x <- c(3,1,7,45,22,2) 
y <- c(23,65,1,23,2,11) 
xy <- data.frame(x,y) 

x1 <- c(0.34,0.3,0.7,0.22,0.67,0.87) 
y1 <- c(0.4,0.13,0.17,0.72,0.61,0.7) 
xy1 <- data.frame(x1,y1) 

    > xy 
     x y 
    1 3 23 
    2 1 65 
    3 7 1 
    4 45 23 
    5 22 2 
    6 2 11 
    > xy1 
     x1 y1 
    1 0.34 0.40 
    2 0.30 0.13 
    3 0.70 0.17 
    4 0.22 0.72 
    5 0.67 0.61 
    6 0.87 0.70 

以下是我希望有一個新的data.frame結果 - 注意它與反覆觀察(兩個y相同的值)的交易。 x1y1現在按照xy數據幀的每列中值的順序排序。

x1 y1 
1 0.30 0.17 
2 0.87 0.61 
3 0.34 0.70 
4 0.70 0.40 
5 0.67 0.72 
6 0.22 0.13 

回答

2

您可以使用order函數來獲取矢量的排序順序。

x <- c(3,1,7,45,22,2) 
y <- c(23,65,1,23,2,11) 
xy <- data.frame(x,y) 

x1 <- c(0.34,0.3,0.7,0.22,0.67,0.87) 
y1 <- c(0.4,0.13,0.17,0.72,0.61,0.7) 
xy1 <- data.frame(x1,y1) 

result <- data.frame(x1[order(x)], y1[order(y)]) 
result 

這將產生

x1.order.x.. y1.order.y.. 
1   0.30   0.17 
2   0.87   0.61 
3   0.34   0.70 
4   0.70   0.40 
5   0.67   0.72 
6   0.22   0.13 

您可以通過結果來設定的列名美化輸出:

data.frame(x1=x1[order(x)], y1=y1[order(y)]) 

現在,如果你不想手動輸入的一切,但有兩個相同尺寸的數據幀,您可以使用此單線程

sapply(1:ncol(xy1), function(i) {xy1[order(xy[,i]), i]}) 

產生

 [,1] [,2] 
[1,] 0.30 0.17 
[2,] 0.87 0.61 
[3,] 0.34 0.70 
[4,] 0.70 0.40 
[5,] 0.67 0.72 
[6,] 0.22 0.13 
1

你可以試試這個:

library(tidyverse) 

df_1 <- xy %>% 
    bind_cols(xy1) %>% 
    arrange(x) %>% 
    select(x1) 

df_2 <- xy %>% 
    bind_cols(xy1) %>% 
    arrange(y) %>% 
    select(y1) 

df <- bind_cols(df_1, df_2) 

將返回:

# A tibble: 6 x 2 
    x1 y1 
    <dbl> <dbl> 
1 0.30 0.17 
2 0.87 0.61 
3 0.34 0.70 
4 0.70 0.40 
5 0.67 0.72 
6 0.22 0.13 

基本上只是安排x1y1通過xy分開,然後結合x1y1

2

由於這是基於order ING對應於兩個數據集的列,Map可用於

xy1[] <- Map(function(x,y) x[order(y)], xy1, xy) 
xy1 
# x1 y1 
#1 0.30 0.17 
#2 0.87 0.61 
#3 0.34 0.70 
#4 0.70 0.40 
#5 0.67 0.72 
#6 0.22 0.13 

或者另一選擇是基於對 'XY' 的colorder, 'XY'

xy1[] <- as.matrix(xy1)[order(col(xy), xy)] 
xy1 
# x1 y1 
#1 0.30 0.17 
#2 0.87 0.61 
#3 0.34 0.70 
#4 0.70 0.40 
#5 0.67 0.72 
#6 0.22 0.13 
相關問題