如果我有以下数据框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将所有内容分开是否最好?
有很多方法可以给这只猫上皮.这是一个使用基本R和矢量化代码分两步(没有任何apply)的解决方案:
order和排序数据xtfrmrle和sequence生成序列.复制您的数据:
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.