1

subjects被験者が服用した薬に対応する一連の変数を含む被験者データセットがあります。その広い変数から、データセット内のすべての薬の一意のセットを作成しました (それがどの特定の変数から来たかに関係なく)。被験者が med を 1 回以上リストすると、その数が 1 増えるように、各 med の被験者数を見つけたいと思います。

以下はゆっくりとした方法ですが、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
4

1 に答える 1

2

どうですか

as.data.frame(table(unlist(apply(subjects, 1, unique))))

より高速な方法があるかもしれませんが、あなたが言及したように、50,000 x 9 のテーブルでまともな仕事 (~1.5 秒) を行います。

于 2012-11-30T19:18:59.060 に答える