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

时间:2017-08-15 19:54:26

标签: r function survey

我使用药物滥用警告网络数据来分析急诊室就诊中的常见药物组合。每种额外的药物都由变量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变量格式,因此合并将与调查设计人员权重变量一致。

2 个答案:

答案 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,其帖子以另一种方式帮助思考问题。