在r中的因子级别内排序和编号

use*_*296 3 r

如果我有以下数据框G:

z    type   x   
1     a     4
2     a     5 
3     a     6
4     b     1
5     b     0.9
6     c     4
Run Code Online (Sandbox Code Playgroud)

我想得到:

z    type   x   y
3     a     6   3
2     a     5   2
1     a     4   1
4     b     1   2
5     b     0.9 1
6     c     4   1
Run Code Online (Sandbox Code Playgroud)

即我想type基于向量在因子水平内对整个数据帧进行排序x.获取每个级别的长度,a = 3 b=2 c=1然后在新向量中以递减的方式编号y.

我的出发地目前是 sort()

tapply(y, x, sort)
Run Code Online (Sandbox Code Playgroud)

首先尝试使用sapply将所有内容分开是否最好?

And*_*rie 7

有很多方法可以给这只猫上皮.这是一个使用基本R和矢量化代码分两步(没有任何apply)的解决方案:

  1. 使用order和排序数据xtfrm
  2. 使用rlesequence生成序列.

复制您的数据:

dat <- read.table(text="
z    type   x   
1     a     4
2     a     5 
3     a     6
4     b     1
5     b     0.9
6     c     4
", header=TRUE, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

两行代码:

r <- dat[order(dat$type, -xtfrm(dat$x)), ]
r$y <- sequence(rle(r$type)$lengths)
Run Code Online (Sandbox Code Playgroud)

结果是:

r
  z type   x y
3 3    a 6.0 1
2 2    a 5.0 2
1 1    a 4.0 3
4 4    b 1.0 1
5 5    b 0.9 2
6 6    c 4.0 1
Run Code Online (Sandbox Code Playgroud)

这个电话order有点复杂.由于您按升序对一列进行排序,而按降序对第二列进行排序,因此请使用辅助函数xtfrm.有关?xtfrm详细信息,请参阅?order.