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

时间:2017-10-28 22:19:16

标签: r sorting dataframe

我想根据xy1数据框的列中值的递增顺序,对xy数据框的列中的值进行排序。

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

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

col

答案 2 :(得分: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