关于r:按两列排序数据框(带条件)

Sort data frame by two columns (with condition)

本问题已经有最佳答案,请猛点这里访问。

我在R中有以下数据帧:

1
2
3
4
5
6
7
8
9
DataTable <- data.frame( Name = c("Nelle","Alex","Thomas","Jeff","Rodger","Michi"), Age = c(17, 18, 18, 16, 16, 16), Grade = c(1,5,3,2,2,4) )

    Name Age Grade
1  Nelle  17     1
2   Alex  18     5
3 Thomas  18     3
4   Jeff  16     2
5 Rodger  16     2
6  Michi  16     4

现在,Ill将按其Age列对该数据帧进行排序。到目前为止没有问题:

1
2
3
4
5
6
7
8
9
DataTable_sort_age <- DataTable[with(DataTable, order(DataTable[,2])),]

    Name Age Grade
4   Jeff  16     2
5 Rodger  16     2
6  Michi  16     4
1  Nelle  17     1
2   Alex  18     5
3 Thomas  18     3

Name列中有更多的人具有相同的年龄,他们应该按字母顺序排序。如果多人同龄的条件为真,则数据帧应按Name的字母顺序排序。输出应该如下所示:

1
2
3
4
5
6
7
    Name Age Grade
1   Jeff  16     2
2  Michi  16     2
3 Rodger  16     4
4  Nelle  17     1
5   Alex  18     5
6 Thomas  18     3

希望您能帮我按字母顺序对数据帧进行排序。


根据@stezzo的评论更新答案

只需在order函数中添加DataTable[, 1]

1
2
3
4
5
6
7
8
9
DataTable[order(DataTable[,2], DataTable[, 1]),]

#    Name Age Grade
# 4   Jeff  16     2
# 6  Michi  16     4
# 5 Rodger  16     2
# 1  Nelle  17     1
# 2   Alex  18     5
# 3 Thomas  18     3

记住,传递参数的顺序很重要。它将首先对数据表数据帧w.r.t第二列进行排序,如果出现绑定,它将考虑第二个参数,即第一列。


除了@ronak shah答案,您还可以使用dplyrarrange。我觉得简单一点。

1
arrange(DataTable,Age,Name)

给予

1
2
3
4
5
6
7
8
    Name Age Grade
1   Alex  16     3
2   Jeff  16     2
3  Michi  16     4
4 Rodger  16     2
5  Nelle  17     1
6   Alex  18     5
7 Thomas  18     4

这里,它首先按Age排序,然后按Name排序,您可以添加更多变量,以此类推。