如果我有以下数据框G:
z type x
1 a 4
2 a 5
3 a 6
4 b 1
5 b 0.9
6 c 4
我想得到:
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
即。我想基于向量type
在因子x
的级别内对整个数据框进行排序。获取每个级别a = 3 b=2 c=1
的长度,然后在新向量y
中以递减的方式编号。
我的出发地点目前是sort()
tapply(y, x, sort)
首先尝试使用sapply来首先拆分所有内容是否最好?
答案 0 :(得分:7)
有很多方法可以给这只猫上皮。这是一个使用基本R和矢量化代码分两步(没有任何apply
)的解决方案:
order
和xtfrm
rle
和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)
两行代码:
r <- dat[order(dat$type, -xtfrm(dat$x)), ]
r$y <- sequence(rle(r$type)$lengths)
结果:
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
对order
的调用有点复杂。由于您按升序排序一列而第二列按降序排序,因此请使用辅助函数xtfrm
。有关详细信息,请参阅?xtfrm
,但?order
中也对此进行了描述。
答案 1 :(得分:4)
我更喜欢Andrie:
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=T)
三行代码:
dat <- dat[order(dat$type), ]
x <- by(dat, dat$type, nrow)
dat$y <- unlist(sapply(x, function(z) z:1))
我编辑了我的回应以适应Andrie提到的评论。这样可行,但是如果你走这条路而不是安德里,你就疯了。