R 函数,用于创建在几列之间唯一的指示符变量值



我正在使用药物滥用警告网络数据来分析急诊室就诊中的常见药物组合。每种额外的药物都由变量DRUGID_1....16中的数字编码。因此,Pt1可能有DRUGID_1 = 44(可卡因(和DRUGID_3 = 20(海洛因(,而Pt2可能有DRUGID_1= 20(海洛因(,DRUGID_3= 44(可卡因(。

我希望我的函数遍历 DRUGID_1...16,并为 200 万患者中的每位患者创建一个新的二进制变量列,为每个唯一药物提及创建一个新的二进制变量列,并将该 pt 的值设置为 1。因此,二进制变量海洛因的值为 1 表示在 pts 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 值的计数器 (Count( 和一个仅包含相关列的新数据帧 (DRUGID.df(。

该函数应该向下移动观察结果,如果不是 NA,那么如果DRUGID_1不在列表中 respDRUGID,则创建一个新的列变量 'r.DRUGID' 并将值设置为 1。同时将唯一计数增加 1。否则,DRUGID_1的值已经在列表中 respDRUGID 然后设置 r.DRUGID = 1

我想我已经看到了关于 get(( 和 apply(( 函数的建议,但我没有遵循如何使用它们。生成的数据帧必须采用相同的 obs x 变量格式,因此合并将与调查设计人员权重变量保持一致。

猜测您的数据和所需的结果格式。使用包整洁

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

我找到了另一个帖子,它使用stringr,destringr,sapply和grepl完全可以做我想要的。在将每个变量组合成一个字符串后,这很有效。

根据每个单元格中的多个 chr 值在 R 中创建虚拟变量

非常感谢epi99,他的帖子帮助以另一种方式思考问题。

最新更新