使用transform和plyr在R中添加计数列

时间:2014-03-24 18:16:56

标签: r plyr

我有一个两级数据集(让我们说在学校里嵌套的类)并且数据集已编码

像这样:

School  Class
  A       1
  A       1
  A       2
  A       2
  B       1
  B       1
  B       2
  B       2

但是要运行分析,我需要数据具有唯一的类ID,无论学校成员身份如何。

School  Class  NewClass
  A       1       1
  A       1       1
  A       2       2
  A       2       2
  B       1       3
  B       1       3
  B       2       4
  B       2       4 

我尝试使用transform和ddply,但我不确定如何让NewClass为School和Class的每个组合不断增加到更大的数字。我可以想到一些不太优雅的方法来做到这一点,但我确信有一些我现在想不到的简单解决方案。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

使用interaction创建一个因子,然后将其强制转换为整数:

transform(dat,nn = as.integer(interaction(Class,School)))
  School Class nn
1      A     1  1
2      A     1  1
3      A     2  2
4      A     2  2
5      B     1  3
6      B     1  3
7      B     2  4
8      B     2  4

答案 1 :(得分:3)

使用data.table

library(data.table)
dt = as.data.table(your_df)

dt[, NewClass := .GRP, by = list(School, Class)]
dt
#   School Class NewClass
#1:      A     1        1
#2:      A     1        1
#3:      A     2        2
#4:      A     2        2
#5:      B     1        3
#6:      B     1        3
#7:      B     2        4
#8:      B     2        4

.GRP只是一个群组计数器。另请注意,您并不需要执行此操作,并且可以在您需要执行的任何list(School, Class)操作中继续使用上述组合by


请注意,在data.table版本>= 1.9.0中,会导出一个函数setDT,通过引用将data.frame转换为data.table(不进行复制),以防万一你想坚持使用data.tables。

require(data.table) ## >= 1.9.0
setDT(your_df)      ## your_df is now a data.table, changed by reference.