2017-08-15 77 views
1
mydata <- data.frame(id = c(rep(1, 3), rep(2, 3), rep(3, 3)), 
         score = c(c(1, 2, 3), c(3, 2, 1), c(1, 3, 2)), 
         location = c(rep(c("X", "Y", "Z"), 3))) 
> mydata 
    id score location 
1 1  1  X 
2 1  2  Y 
3 1  3  Z 
4 2  3  X 
5 2  2  Y 
6 2  1  Z 
7 3  1  X 
8 3  3  Y 
9 3  2  Z 

我想根据score从小到大每个id排序我data.frame订购data.frame列。如何通过另一个变量

简化排序score忽略id列。

> mydata[with(mydata, order(score)),] 
    id score location 
1 1  1  X 
6 2  1  Z 
7 3  1  X 
2 1  2  Y 
5 2  2  Y 
9 3  2  Z 
3 1  3  Z 
4 2  3  X 
8 3  3  Y 

从本质上讲,我希望我的输出是

id score location 
1 1  1  X 
2 1  2  Y 
3 1  3  Z 
4 2  1  Z 
5 2  2  Y 
6 2  3  X 
7 3  1  X 
8 3  2  Z 
9 3  3  Y 

回答

2

使用base R只。

mydata[order(mydata$id, mydata$score), ] 
    id score location 
1 1  1  X 
2 1  2  Y 
3 1  3  Z 
6 2  1  Z 
5 2  2  Y 
4 2  3  X 
7 3  1  X 
9 3  2  Z 
8 3  3  Y 
2

您可以使用dplyr包:

library(dplyr) 
mydata %>% arrange(id,score) 

# id score location 
# 1 1  1  X 
# 2 1  2  Y 
# 3 1  3  Z 
# 4 2  1  Z 
# 5 2  2  Y 
# 6 2  3  X 
# 7 3  1  X 
# 8 3  2  Z 
# 9 3  3  Y 
相关问题