在现有数据框架内创建新二进制变量的功能?

时间:2017-03-14 14:08:50

标签: r

此问题与上一主题相关: How to use custom function to create new binary variables within existing dataframe?

我想使用类似的功能,但能够使用向量在数据帧中指定要搜索的ICD9诊断变量(例如," diag_1"," diag_2", " diag_1"等)

我试过

y<-c("diag_1","diag_2","diag_1") 

diagnosis_func(patient_db, y, "2851", "Anemia")

但是我收到以下错误:

Error in `[[<-`(`*tmp*`, i, value = value) : 
  recursive indexing failed at level 2 

以下是Benjamin在参考文章中的工作职能。但是,它一次只能从1个诊断变量起作用。最后,我需要创建一个新的二进制变量,通过查询数据帧的25个诊断变量来指示患者是否有特定的诊断。

* targetcolumn是icd9诊断变量&#34; diag_1&#34; ...&#34; diag_20&#34;是我想输入的那个

diagnosis_func <- function(data, target_col, icd, new_col){
  pattern <- sprintf("^(%s)", 
                 paste0(icd, collapse = "|"))

  data[[new_col]] <- grepl(pattern = pattern, 
                       x = data[[target_col]]) + 0L
  data
}

diagnosis_func(patient_db, "diag_1", "2851", "Anemia")

此非功能版本适用于多种诊断。但是我还没有弄清楚如何在上面的函数版本中使用它。

 pattern = paste("^(", paste0("2851", collapse = "|"), ")", sep = "")

df$anemia<-ifelse(rowSums(sapply(df[c("diag_1","diag_2","diag_3")], grepl, pattern = pattern)) != 0,"1","0")

非常感谢有关如何使此功能正常工作的任何帮助或指导。

最佳, 阿尔比特

1 个答案:

答案 0 :(得分:1)

试试本杰明功能的这个修改版本:

diagnosis_func <- function(data, target_col, icd, new_col){
  pattern <- sprintf("^(%s)", 
                     paste0(icd, collapse = "|"))

  new <- apply(data[target_col], 2, function(x) grepl(pattern=pattern, x)) + 0L
  data[[new_col]] <- ifelse(rowSums(new)>0, 1,0)
  data
}