2017-08-15 129 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 
相關問題