2017-08-15 67 views
1

我正在使用藥物濫用警告網絡數據來分析ER訪問中的常見藥物組合。每種額外的藥物都通過變量DRUGID_1 .... 16中的數字編碼。所以Pt1可能有DRUGID_1 = 44(可卡因)和DRUGID_3 = 20(海洛因),而Pt2可能有DRUGID_1 = 20(海洛因),DRUGID_3 = 44(可卡因)。R功能可在多個列之間創建唯一的指示變量值

我希望我的函數循環遍歷DRUGID_1 ... 16,並且對於200萬患者中的每一個爲每個獨特的藥物提及創建一個新的二元變量列,併爲該pt設置值爲1。因此,二元變量Heroin的值爲1表示在提到DRUGID_1 .... 16海洛因的某處。

respDRUGID <- character(0) 
DRUGID.df <- data.frame(allDAWN$DRUGID_1, allDAWN$DRUGID_2, allDAWN$DRUGID_3) 

Count <- 0 
DrugPicker <- function(DRUGID.df){ 
    for(i in seq_along(DRUGID.df$allDAWN.DRUGID_1)){ 
    if (!'NA' %in% DRUGID.df[,allDAWN.DRUGID_1]){ 
     if (!is.element(DRUGID.df$allDAWN.DRUGID_1,respDRUGID)){ 
     Count <- Count + 1 
     respDRUGID[Count] <- as.character(DRUGID.df$allDAWN.DRUGID_1[Count]) 
     assign(paste('r', as.character(respDRUGID[Count,]), sep='.'), 1)} 
     else { 
     assign(paste("r", as.character(respDRUGID[Count,]), sep='.'), 1)} 
    } 
    } 
} 
DrugPicker(DRUGID.df) 

在這裏,我試圖首先要包含每個新DRUGIDx值(respDRUGID),以及總人數唯一DRUGID值的計數器(計數)和一個新的數據框(DRUGID.df)與列表只是相關的專欄。

該函數應該向下移動觀察值,如果不是NA,那麼如果DRUGID_1不在列表respDRUGID中,則創建一個新的列變量'r.DRUGID'並將值設置爲1.同時將唯一計數增加1 。否則DRUGID_1的值已經在列表respDRUGID然後設置r.DRUGID = 1

我想我已經看到get()和apply()函數的建議,但我沒有按照如何使用它們。生成的數據幀必須採用相同的obs x變量格式,因此合併將與調查設計人員權重變量保持一致。

+0

如果您提供樣本數據,您更有可能獲得幫助。用'dput'提供最少的樣本數據是首選 – epi99

回答

1

猜測您的數據和所需的結果格式。使用包裝外觀

drug_df <- read.csv(text=' 
patient,DRUGID_1,DRUGID_2,DRUGID_3 
A,1,2,3 
B,2,, 
C,2,1, 
D,3,1,2 
') 

library(tidyverse) 
gather(drug_df, value = "DRUGID", ... = -patient, na.rm = TRUE) %>% 
    arrange(patient, DRUGID) %>% 
    group_by(patient) %>% 
    summarize(DRUGIDs = paste(DRUGID, collapse=",")) 

# patient DRUGIDs 
# <fctr> <chr> 
# 1  A 1,2,3 
# 2  B  2 
# 3  C  1,2 
# 4  D 1,2,3