我使用药物滥用警告网络数据来分析急诊室就诊中的常见药物组合。每种额外的药物都由变量DRUGID_1 ...... 16中的数字编码。因此,Pt1可能具有DRUGID_1 = 44(可卡因)和DRUGID_3 = 20(海洛因),而Pt2可能具有DRUGID_1 = 20(海洛因),DRUGID_3 = 44(可卡因)。
我希望我的功能循环通过DRUGID_1 ... 16并为200万患者中的每一个为每个独特的药物提及创建一个新的二元变量列,并将该值设置为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)以及一个计数器(Count),用于显示唯一的DRUGID值总数和一个仅包含相关列的新数据帧(DRUGID.df)
该函数应该向下移动观察值,如果不是NA,那么如果DRUGID_1不在列表respDRUGID中,则创建一个新的列变量&r; DRUGID&#39;并将值设置为1.同时将唯一计数增加1.否则,DRUGID_1的值已在列表respDRUGID中,然后设置为r.DRUGID = 1
我认为我已经看到了get()和apply()函数的建议,但我没有按照如何使用它们。结果数据框必须采用相同的obs x变量格式,因此合并将与调查设计人员权重变量一致。
答案 0 :(得分:1)
猜测您的数据和所需的结果格式。使用包tidyverse
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
答案 1 :(得分:0)
我找到了另一篇文章,它使用stringr,destring,sapply和grepl完全符合我的要求。将每个变量组合成一个字符串后,这很有效。
Creating dummy variables in R based on multiple chr values within each cell
非常感谢epi99,其帖子以另一种方式帮助思考问题。