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

时间:2012-04-25 17:20:35

标签: r

如果我有以下数据框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来首先拆分所有内容是否最好?

2 个答案:

答案 0 :(得分:7)

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

  1. 使用orderxtfrm
  2. 对数据进行排序
  3. 使用rlesequence生成序列。
  4. 复制您的数据:

    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提到的评论。这样可行,但是如果你走这条路而不是安德里,你就疯了。