将脚本变成函数

时间:2019-06-30 06:30:50

标签: r dplyr stringr

我有一个脚本,可以使用mutate与str_detect结合使用以指示旧变量中是否存在药物成分,从而在现有数据框中成功创建新列。我想将此脚本转换为函数,以使其易于重复使用。我创建功能的尝试失败。

以下是脚本:

Drug_Table_Names <- data.frame(mutate(
    Drug_Table_Names, 
    DRUG_GENERIC_NAME, 
    Flurbiprofen = str_detect(Drug_Table_Names$DRUG_GENERIC_NAME,"FLURBIPROFEN", negate = FALSE)
))

该脚本在DRUG_GENERIC_NAME列中找到Flurbiprofen,并创建一个名为FLUBIPROFEN的新列,如果存在Flurbiprofen,则为TRUE。

我创建函数FlagDrugNames的尝试是这样写的:

function(drug_flag, gen_name){
    Drug_Table_Names <- data.frame(mutate(
        Drug_Table_Names, 
        DRUG_GENERIC_NAME, 
        drug_flag = str_detect(Drug_Table_Names$DRUG_GENERIC_NAME,
                               "gen_name", negate = FALSE)
    ))
}

drug_flag是函数要查找的字符串,在上面的示例中是Flurbiprofen,gen_name是它创建的列的名称。此功能不起作用。

对于该功能的帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

就像评论中所说的那样,问题中的代码使可以简化的事情变得复杂。

library(tidyverse)

flagCol <- function(DF, gen_name){
  DF %>%
    mutate(drug_flag = str_detect(DRUG_GENERIC_NAME, gen_name))
}

使用示例数据集测试该功能。

Drug_Table_Names <- letters[1:10]
DRUG_GENERIC_NAME <- LETTERS[1:10] 

df1 <- data.frame(Drug_Table_Names, DRUG_GENERIC_NAME)

flagCol(df1, "G")
#   Drug_Table_Names DRUG_GENERIC_NAME drug_flag
#1                 a                 A     FALSE
#2                 b                 B     FALSE
#3                 c                 C     FALSE
#4                 d                 D     FALSE
#5                 e                 E     FALSE
#6                 f                 F     FALSE
#7                 g                 G      TRUE
#8                 h                 H     FALSE
#9                 i                 I     FALSE
#10                j                 J     FALSE

修改

OP在comment中问两个问题。

问题2:

  

我想要新变量的名称,它是您的   上面的示例,与我要查找的字符串相同   str_detect。有一种向函数添加参数的方法   它会接受与gen_name值相同的字符串吗?

是的,有。下面的函数可以做到这一点,并且不需要加载软件包dplyr,只需加载软件包stringr。它接受一个额外的参数DRUG_COL,默认设置为"DRUG_GENERIC_NAME",即要在其中查找gen_name的列的名称。

flagCol2 <- function(DF, gen_name, DRUG_COL = "DRUG_GENERIC_NAME"){
  DF[[gen_name]] <- str_detect(DF[[DRUG_COL]], gen_name)
  DF
}

flagCol2(df1, "G")
#   Drug_Table_Names DRUG_GENERIC_NAME     G
#1                 a                 A FALSE
#2                 b                 B FALSE
#3                 c                 C FALSE
#4                 d                 D FALSE
#5                 e                 E FALSE
#6                 f                 F FALSE
#7                 g                 G  TRUE
#8                 h                 H FALSE
#9                 i                 I FALSE
#10                j                 J FALSE

问题1(我的重点):

  

它当前返回一个小标题,我希望它向其中添加新变量   原始数据框是Drug_Table_Names。我如何修改   功能来做到这一点。

flagColflagCol2都不需要修改功能。所有要做的就是将结果分配回原始数据帧。

df1 <- flagCol(df1, "G")

或第二个版本。

df1 <- flagCol2(df1, "G")

编辑2。

多个基因传递给该功能。

flagCol3 <- function(DF, gen_name, DRUG_COL = "DRUG_GENERIC_NAME"){
  for(gn in gen_name){
    DF[[gn]] <- str_detect(DF[[DRUG_COL]], gn)
  }
  DF
}

# There is no gene "X", but the column is created
df3 <- flagCol3(df1, c("B", "G", "X"))