【问题标题】:Sorting values in dataframe by order of values in another dataframe R按另一个数据帧R中的值顺序对数据帧中的值进行排序
【发布时间】:2017-10-29 11:03:30
【问题描述】:

我想根据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 数据帧的每一列中的值的顺序进行排序。

    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

【问题讨论】:

    标签: r sorting dataframe


    【解决方案1】:

    您可以使用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】:

      由于这是基于ordering 两个数据集上的对应列,所以可以使用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' 的 col

      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
      

      【讨论】:

        【解决方案3】:

        你可以试试这个:

        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组合起来。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-12
          • 2016-08-25
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 2012-07-20
          • 1970-01-01
          相关资源
          最近更新 更多