如何按多列对数据框进行排序,每列的方向不同?

时间:2019-02-28 18:06:58

标签: r dataframe

我想在第一列上按ASC顺序排序,在第二列上按DESC顺序排序。假设我有以下数据:

names <- c("a", "a", "b", "b", "b")
values <- c(4,1,1,2,4)
smallData <- data.frame(name = names, value = values)
smallData
  name value
2    a     1
3    b     1
4    b     2
1    a     4
5    b     4

我知道我可以像这样订购smallData

smallData[order(smallData$name),]
smallData[order(smallData$name, decreasing = T),]
smallData[order(smallData$name, smallData$value),]

但是如何按名称ASC然后按值DESC订购?输出应如下所示:

  name value
1    a     4
2    a     1
5    b     4
4    b     2
3    b     1

注意:希望采用基本的R实现,但对如何做到这一点感到好奇

2 个答案:

答案 0 :(得分:1)

我们可以将value的值设置为负值以颠倒该顺序:

smallData[order(smallData$name, -smallData$value),]

rank,也可以使用字符变量:

smallData[order(smallData$name, -rank(smallData$value)),]

输出:

  name value
1    a     4
2    a     1
5    b     4
4    b     2
3    b     1

答案 1 :(得分:-1)

不确定这是否是您的意思,但是您可以通过以下方式使用order

names <- c("paul", "mark", "dave", "will", "john")
values <- c(1,4,1,2,1)
smallData <- data.frame(name = names, value = values)

index <- order(smallData$name)
smallData <- smallData[index,]

index <- order(smallData$value)
smallData <- smallData[index,]

哪个输出:

> smallData
  name value
3 dave     1
5 john     1
1 paul     1
4 will     2
2 mark     4