首页 文章

按照另一个数据帧R中的值的顺序对数据帧中的值进行排序

提问于
浏览
1

我想根据 xy 数据帧的列中值的递增顺序对 xy1 数据帧的列中的值进行排序 .

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 dataframe的每列中的值的顺序进行排序 .

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

3 回答

  • 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 函数来获取向量的排序顺序 .

    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
    
  • 2

    由于这是基于两个数据集上的相应列,因此可以使用 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
    

    或者另一种选择是 order 基于'xy'的'xy','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
    

相关问题