R:根据向量的顺序对数据帧进行排序?

时间:2016-04-12 02:59:36

标签: r dataframe

这是我的示例数据框

df <- data.frame(id=rep(c(123,456),each=5),col1=c(3,6,4,3,8,9,2,1,3,4),col2=c(7,8,5,4,6,8,7,5,8,3))

    id col1 col2
1  123    3    7
2  123    6    8
3  123    4    5
4  123    3    4
5  123    8    6
6  456    9    8
7  456    2    7
8  456    1    5
9  456    3    8
10 456    4    3

desiredOrder <- rep(c(456,123),each=5)

我想根据特定向量(desiredOrder)中指定的顺序进行排序,以便输出如下所示:

    id col1 col2
1  456    9    8
2  456    2    7
3  456    1    5
4  456    3    8
5 456    4    3
6  123    3    7
7  123    6    8
8  123    4    5
9  123    3    4
10  123    8    6

(所以id = 456的行在id = 123的行上方向上移动,但保留了行的原始顺序)

我试过了:

df[match(df$id,desiredOrder),] 

然而,结果与我所追求的相差甚远:

     id col1 col2
6   456    9    8
6.1 456    9    8
6.2 456    9    8
6.3 456    9    8
6.4 456    9    8
1   123    3    7
1.1 123    3    7
1.2 123    3    7
1.3 123    3    7
1.4 123    3    7

3 个答案:

答案 0 :(得分:3)

我们可以将{id'列转换为factor,并将levels指定为unique中的vector元素,然后执行order

df[order(factor(df$id, levels=unique(desiredOrder))),]
#    id col1 col2
#6  456    9    8
#7  456    2    7
#8  456    1    5
#9  456    3    8
#10 456    4    3
#1  123    3    7
#2  123    6    8
#3  123    4    5
#4  123    3    4
#5  123    8    6

答案 1 :(得分:2)

你也可以这样做:

library(dplyr)

data_frame(id = desiredOrder) %>%
  distinct %>%
  left_join(df)

答案 2 :(得分:0)

您还可以使用dplyr库的arrange()和desc()函数:

library(dplyr)
arrange(df, desc(id))

    id col1 col2
1  456    9    8
2  456    2    7
3  456    1    5
4  456    3    8
5  456    4    3
6  123    3    7
7  123    6    8
8  123    4    5
9  123    3    4
10 123    8    6