这是我的示例数据框
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
答案 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