检查字符串是否存在于多列中并返回true / false列

时间:2018-07-30 21:29:05

标签: r dplyr mutate

数据集类似于:

Day   Age    Med1, Med2, Med3, Med4 ... Med 18
 M     42     En    Fu    Gt    Di       Mo
 F     36     Gt    Pa    Mo    En       Mo
 F     89     Gt    Pa    Pa    En       Na      

例如,如果Med1-Med18列中存在“ Mo”,我想添加一个返回True / False的列。

Day   Age    Med1, Med2, Med3, Med4 ... Med 18  MoGiven
 M     42     En    Fu    Gt    Di       Mo        T
 F     36     Gt    Pa    Mo    En       Mo        T
 F     89     Gt    Pa    Pa    En       Na        F

看过其他各种线程,最接近的解决方案似乎是:

raw <- imported_data %>%
  mutate_at(var(contains("Med")), funs(.=='Mo')

但出现错误no applicable method for 'tbl_vars' applied to an object of class "quosures"

除非可能,否则将尽可能避免对每列进行嵌套ifelse,

我在右边吗?

1 个答案:

答案 0 :(得分:2)

您可以将data.frame的所有列与文本进行比较,以获得TRUE/FALSE的矩阵。现在,可以使用rowSums来获取每一行中匹配列的数量。如果计数等于或大于1,则比MoGivenTRUE,否则为FALSE

base-R函数startsWith可用于获取以Med开头的仅子集列。

df$MoGiven <- (rowSums(df[,startsWith(names(df),"Med")]=="Mo") >= 1)

#Modified df 
df
#   Day Age Med1 Med2 Med3 Med4 Med18 MoGiven
# 1   M  42   En   Fu   Gt   Di    Mo    TRUE
# 2   F  36   Gt   Pa   Mo   En    Mo    TRUE
# 3   F  89   Gt   Pa   Pa   En    Na   FALSE

数据:

df <- read.table(text =
"Day   Age    Med1 Med2 Med3 Med4  Med18
M     42     En    Fu    Gt    Di       Mo
F     36     Gt    Pa    Mo    En       Mo
F     89     Gt    Pa    Pa    En       Na",
header = TRUE, stringsAsFactors = FALSE)