Как посчитать количество комбинаций логических данных в R - PullRequest
9 голосов
/ 25 августа 2011

Каков наилучший способ определения фактора или создания нового поля категории на основе числа логических полей?В этом примере мне нужно посчитать количество уникальных комбинаций лекарств.

   > MultPsychMeds
       ID OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE
    1   A          1           1          0           0
    2   B          1           0          1           0
    3   C          1           0          1           0
    4   D          1           0          1           0
    5   E          1           0          0           1
    6   F          1           0          0           1
    7   G          1           0          0           1
    8   H          1           0          0           1
    9   I          0           1          1           0
    10  J          0           1          1           0

Возможно, еще один способ заявить, что мне нужно поворачивать или скрещивать пары.Окончательные результаты должны выглядеть примерно так:

Combination            Count
OLANZAPINE/HALOPERIDOL     1
OLANZAPINE/QUETIAPINE      3
OLANZAPINE/RISPERIDONE     4
HALOPERIDOL/QUETIAPINE     2

Этот кадр данных можно скопировать в R с помощью:

MultPsychMeds <- structure(list(ID = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), OLANZAPINE = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L), HALOPERIDOL = c(1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), QUETIAPINE = c(0L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 1L, 1L), RISPERIDONE = c(0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 0L, 0L)), .Names = c("ID", "OLANZAPINE", "HALOPERIDOL", 
"QUETIAPINE", "RISPERIDONE"), class = "data.frame", row.names = c(NA, 
-10L))

Ответы [ 3 ]

8 голосов
/ 25 августа 2011

Вот один подход с использованием пакетов reshape и plyr:

library(reshape)
library(plyr)

#Melt into long format
dat.m <- melt(MultPsychMeds, id.vars = "ID")
#Group at the ID level and paste the drugs together with "/"
out <- ddply(dat.m, "ID", summarize, combos = paste(variable[value == 1], collapse = "/"))

#Calculate a table
with(out, count(combos))

                       x freq
1 HALOPERIDOL/QUETIAPINE    2
2 OLANZAPINE/HALOPERIDOL    1
3  OLANZAPINE/QUETIAPINE    3
4 OLANZAPINE/RISPERIDONE    4
5 голосов
/ 25 августа 2011

Просто для удовольствия, решение base R (которое можно превратить в единый :-)):

data.frame(table(apply(MultPsychMeds[,-1], 1, function(currow){
    wc<-which(currow==1)
    paste(colnames(MultPsychMeds)[wc+1], collapse="/")
})))
2 голосов
/ 26 августа 2011

Другой способ может быть:

subset(
    as.data.frame(
        with(MultPsychMeds, table(OLANZAPINE, HALOPERIDOL, QUETIAPINE, RISPERIDONE)),
        responseName="count"
    ),
    count>0
)

, что дает

   OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE count
4           1           1          0           0     1
6           1           0          1           0     3
7           0           1          1           0     2
10          1           0          0           1     4

Это не совсем то, что вам нужно, но быстро и просто.


В пакете plyr есть сокращение :

require(plyr)
count(MultPsychMeds, c("OLANZAPINE", "HALOPERIDOL", "QUETIAPINE", "RISPERIDONE"))
#   OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE freq
# 1          0           1          1           0    2
# 2          1           0          0           1    4
# 3          1           0          1           0    3
# 4          1           1          0           0    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...