3

如果我有以下数据框 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 来拆分所有内容吗?

4

2 回答 2

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)

两行代码:

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

于 2012-04-25T17:31:20.777 回答
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=T)

三行代码:

dat <- dat[order(dat$type), ]
x <- by(dat, dat$type, nrow)
dat$y <- unlist(sapply(x, function(z) z:1))

我编辑了我的回复以适应安德烈提到的评论。这行得通,但如果你走这条路而不是安德烈,那你就疯了。

于 2012-04-25T17:35:30.657 回答