2011-08-25 53 views
9

根據多個布爾字段確定因子或創建新類別字段的最佳方法是什麼?在這個例子中,我需要計算藥物的獨特組合數量。如何計算R中布爾數據組合的數量

> 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)) 
+2

1用於提供數據。不過,我相信你需要更新你的頭銜,因爲似乎沒有涉及布爾(邏輯),也沒有任何「轉換」正在進行。你可以修改它爲'計數共同事件的數量'或類似的東西嗎? –

+0

謝謝。修改標題以匹配實際問題。關於布爾值,原始數據包括0表示FALSE和1表示TRUE,R表示從.csv文件加載時將這些變量設置爲整數。如果這些過程先轉換爲邏輯變量,這個過程會更好嗎? – Rollie

+1

我認爲布爾的引用很好,直觀,R等於1和TRUE是一樣的,據我所知(可能有些情況下,這是不正確的)。例如,'> 1 == TRUE [1] TRUE' – Chase

回答

8

下面是一個使用reshapeplyr包一個做法:

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 
+0

這是非常有用的,我正在尋找。謝謝 – Rollie

5

只是爲了好玩,一個基本的R解決方案(可以變成一個oneliner :-)):

data.frame(table(apply(MultPsychMeds[,-1], 1, function(currow){ 
    wc<-which(currow==1) 
    paste(colnames(MultPsychMeds)[wc+1], collapse="/") 
}))) 
2

另一種方式可以是:

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 package

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