R语言dplyr:列名存于向量时,如何在grepl中过滤列?
使用dplyr结合外部列名与grepl过滤数据框的解决方案
当使用dplyr过滤数据框时,若列名存储在外部向量中,常规的!!语法在与grepl结合时会失效,以下是可行的单行解决代码及问题说明:
示例代码
data <- read.table(text="Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos A 1 1 0 0 1 B 0 1 1 0 0 C 1 0 1 1 1 D 0 1 0 0 1",h=T) kw <- "B|D" # 直接指定列名,代码可行 data %>% filter(grepl(toupper(kw), toupper(Sol_name))) # 输出结果: # Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos # 1 B 0 1 1 0 0 # 2 D 0 1 0 0 1 col_name <- "Sol_name" # 使用!!直接传入列名字符串,代码不可行 data %>% filter(grepl(toupper(kw), toupper(!!col_name))) # 输出结果: # [1] Sol_name geo_pos loc_pos dol_pos pol_pos kol_pos # <0 lignes> (ou 'row.names' de longueur nulle)
可行的单行代码
方法1:使用.data代词(推荐)
data %>% filter(grepl(toupper(kw), toupper(.data[[col_name]])))
方法2:将字符串转为符号再引用
data %>% filter(grepl(toupper(kw), toupper(!!rlang::sym(col_name))))
问题原因
原代码中!!col_name只是将字符串"Sol_name"直接传入toupper(),而非提取数据框中对应列的数值,grepl会尝试匹配字符串"SOL_NAME"与"B|D"的大写形式"BD",自然无匹配结果,导致返回空数据框。
内容的提问来源于stack exchange,提问作者yeahman269
相关产品推荐
相关产品推荐

