为plyr的子集添加ID或索引列

时间:2014-09-16 09:04:13

标签: r plyr

假设我有数据

item   cond      foo
   1      1 3.733333
   2      1 4.766667
   3      1 4.133333
   4      2 4.466667
   5      2 2.800000
   6      2 2.300000

我需要生成一个新列,该列唯一标识itemcond个值,因此我想:

item   cond      foo  item_per_cond
   1      1 3.733333              1
   2      1 4.766667              2
   3      1 4.133333              3
   4      2 4.466667              1
   5      2 2.800000              2
   6      2 2.300000              3

我认为我会选择这样的东西,但我不知道...应该在这里做什么?

ddply(d, .(cond), transform, ...)

3 个答案:

答案 0 :(得分:2)

解决方案是使用seq_along列名:

ddply(d, .(cond), transform, item_per_cond = seq_along(item)

答案 1 :(得分:1)

由于您对plyr解决方案特别感兴趣,因此您可能需要考虑Hadley Wickham的新dplyr包:

library(dplyr)
df <- df %>% group_by(cond) %>% mutate(item_per_cond = seq_along(item))

得出以下结果:

  item cond      foo item_per_cond
1    1    1 3.733333             1
2    2    1 4.766667             2
3    3    1 4.133333             3
4    4    2 4.466667             1
5    5    2 2.800000             2
6    6    2 2.300000             3

答案 2 :(得分:1)

这是一种dplyr方法。

item <- c(1,1,2,3,5,1,2,2,2,5)
cond <- rep(c(1,2), each = 5)
value <- runif(10, 10, 20)

foo <- data.frame(item, cond, value, stringsAsFactors = F)

foo %>%
    group_by(cond) %>%
    mutate(index = dense_rank(item))

   item cond    value index
1     1    1 11.66528     1
2     1    1 18.22134     1
3     2    1 18.17833     2
4     3    1 16.58589     3
5     5    1 14.75184     4
6     1    2 11.65522     1
7     2    2 12.74313     2
8     2    2 17.17077     2
9     2    2 11.37193     2
10    5    2 12.43162     3