数据集类似于:
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,
我在右边吗?
答案 0 :(得分:2)
您可以将data.frame的所有列与文本进行比较,以获得TRUE/FALSE
的矩阵。现在,可以使用rowSums
来获取每一行中匹配列的数量。如果计数等于或大于1
,则比MoGiven
为TRUE
,否则为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)