汇总data.table中的列以进行描述性统计

时间:2014-12-01 23:05:02

标签: r data.table aggregate

我正在查看个别学生级别的学生数据集。

我想做的是在教师学位层面做一些描述性分析。

这是一些学生正在攻读两个学位(双学位,如信息技术学士学位和理学士学位),所以有些学生可以获得两个学位。

我的数据如下所示。教师任务(无论是FAC1还是FAC2)是任意的。

  studid    FAC1     FAC2   SUCCESS SEX     AVE_MARK  
    1       IT       ARTS     0     Male    65
    2       SCIENCE           1     Male    35
    3       LAW               0     Male    98
    4       IT       SCIENCE  0     Female  55
    5       COMMERCE IT       0     Female  20
    6       COMMERCE IT       1     Male    80

这是用

生成的
students<-data.table(studid=c(1:6) ,FAC1 = c("IT","SCIENCE", "LAW","IT","COMMERCE","COMMERCE"), FAC2 = c("ARTS","","","SCIENCE","IT","IT"), SUCCESS = c(0,1,0,0,0,1), SEX=c("Male","Male","Male","Female","Female","Male"), AVE_MARK=c(65,35,98,55,20,80))

我如何制作这样的(制作数字)来创建包含FAC1和FAC2列的Faculty列?我一直在尝试使用FAC1和FAC2之间的lapply函数,但是仍然达到死胡同(即学生[,lapply(.SD,mean),= agg.by,.SDcols = c(&#39; FAC1&#39; ,&#39; FAC2&#39;)]

  FACULTY    MEAN_SUCCESS    AVE_MARK  
  IT         0.65               65
  SCIENCE    1                  50 
  LAW        0.76               50 
  ARTS       0.55               50 
  COMMERCE   0.40               10 

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这似乎就是你要找的东西。

library(reshape2)
DT <- melt(students,measure.vars=c("FAC1","FAC2"),value.name="FACULTY")[nchar(FACULTY)>0]
DT[,list(mean_success=mean(SUCCESS),ave_mark=mean(AVE_MARK)),by=FACULTY]
#     FACULTY mean_success ave_mark
# 1:       IT         0.25       55
# 2:  SCIENCE         0.50       45
# 3:      LAW         0.00       98
# 4: COMMERCE         0.50       50
# 5:     ARTS         0.00       65

因此,这会使用包melt(...)中的reshape2函数来折叠两个教师列,复制所有其他列。不幸的是,这导致一些列具有空白的教师,因此我们必须摆脱使用[nchar(FACULTY)>0]的列。然后根据(新)FACULTY列进行聚合很简单。