每个主题一次计算一个宽变量的计数

时间:2012-11-30 19:01:28

标签: r data.table

我有一个主题数据集subjects,其中包含一组与主题药物相对应的变量。从那个广泛的变量中,我在数据集中创建了一组独特的meds(无论它来自哪个特定变量)。 我想找到每个med的主题计数,这样如果一个主题列出一次或多次med,则该计数增加1。

以下是一种缓慢的方法,但我有9个med变量和50,000多个主题。有人能帮我找出更有效的方法吗?感谢。

subjects <- data.table(
 med1= as.factor(c("NASONEX","ALBUTEROL","","BENADRYL","THEODUR")),
 med2= as.factor(c("","ALBUTEROL","ASBRON","NASONEX","MONTEKULAST")),
 medrecent= as.factor(c("MONTEKLUAST","","","THEODUR",""))
 )

 medvarnames <- c("med1","med2","medrecent")

 allmeds <- data.table(
 med=subjects[,unique(unlist(sapply(.SD,levels))), .SDcols=medvarnames],
 count=0
 )

 for(i in 1: dim(subjects)[1]){
 allmeds[, count := count +
 sapply(allmeds$med,function(.m){
 as.integer(
 any(.m == subjects[i,.SD,.SDcols=medvarnames],na.rm=TRUE)
 )
 })
 ]
 }

 allmeds
           med count
1:                 4
2:   ALBUTEROL     1
3:    BENADRYL     1
4:     NASONEX     2
5:     THEODUR     2
6:      ASBRON     1
7: MONTEKULAST     1
8: MONTEKLUAST     1

1 个答案:

答案 0 :(得分:2)

怎么样?
as.data.frame(table(unlist(apply(subjects, 1, unique))))

可能会有更快的方法,但它在你提到的50,000乘9的桌子上做得不错(约1.5秒)。