我有一个脚本,可以使用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是它创建的列的名称。此功能不起作用。
对于该功能的帮助,我们将不胜感激。
答案 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。我如何修改 功能来做到这一点。
flagCol
和flagCol2
都不需要修改功能。所有要做的就是将结果分配回原始数据帧。
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"))