通过移动数据行对数据行进行排序,以使最大值位于顶部

时间:2019-06-24 20:00:01

标签: r

我有一个如下数据框,其值需要排序。

Name Bin Value
a    1   10
a    2   1000
a    3   1
a    4   100
b    1   20
b    2   2
b    3   200
b    4   2000

我希望最大值在保持值相对于其他值的相对位置的顶部,以便新顺序如下所示。

Name Bin Value
a    1   1000
a    2   1
a    3   100
a    4   10
b    1   2000
b    2   20
b    3   2
b    4   200

不仅要将最大的Value移到顶部,还需要像Value {{1} }在新旧Value中,{}总是低于a 1

1 个答案:

答案 0 :(得分:0)

定义一个函数,该函数采用一个向量并将其向上移动,将最大值移到顶部,然后将最大值之前的值移到底部。使用ave将其应用于按名称显示的值。

max2top <- function(x) {
  wx <- which.max(x) - 1
  if (wx == 0) x else c(tail(x, -wx), head(x, wx))
}
transform(DF, Value = ave(Value, Name, FUN = max2top))

给予

Name Bin Value
1    a   1  1000
2    a   2     1
3    a   3   100
4    a   4    10
5    b   1  2000
6    b   2    20
7    b   3     2
8    b   4   200

注意

可复制形式的输入:

Lines <- "Name Bin Value
a    1   10
a    2   1000
a    3   1
a    4   100
b    1   20
b    2   2
b    3   200
b    4   2000"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)