R语言移除含特定字符串行时结果为空的问题求助
问题:移除数据框中含特定字符串的行时意外清空所有内容
输入数据
# 数据框PKV的内容: ID Aufzeichnungen <dbl> <chr> 1 1 "Aufzeichnungen" 2 1 "07.03.22 A: stechender Schmerz" 3 1 " scharfkantig" 4 1 "D/B:" 5 1 "T:" 6 1 "pat aht an 36 üz distal" 7 1 " seit paartagen" 8 1 "36 vipr++" 9 1 " perk-" 10 1 " keine c zu entdekcne" 11 1 "üz bilfuird" 12 1 "pat aufgekläörtggf RÖ um c auszuschileßen" 13 1 " pat verweigert RÖ aus Angst vor Strahlung" 14 1 " pat" 15 1 "aufgeklärt angst nicht nötig und c unter fllg oder apprx nicht auszuschließen" 16 1 "" 17 1 "pat knirscht" 18 1 " schiene empohlen" 19 1 " pat meldet sich.."
待移除的字符串规则
定义正则匹配的字符串列表:
remove_list <- paste(c("einverst", "empf", "raten", "aufgeklä", "nicht", "weiß nicht", "bespr", "soll", "kein", "?", "raten", "klären", "überprüf", "erst, wenn", "verweiger", "notwendig"), collapse = '|')
预期与实际结果
- 预期:仅移除包含上述字符串的行(行10、12、13、15)
- 实际:所有行被移除,输出空数据框:
# A tibble: 0 × 2 # Groups: ID [0] # … with 2 variables: ID <dbl>, Aufzeichnungen <chr>
尝试过的代码
# base R方法 removed <- PKV[grep(remove_list, PKV$Aufzeichnungen, invert = TRUE), ] # dplyr方法(出错的关键所在) removed <- PKV %>% filter(!grepl(remove.list, PKV$Aufzeichnungen ))
解决方案
核心错误:变量名拼写错误
你在dplyr代码里写的是remove.list,但定义的变量是remove_list(下划线和点混淆)。未定义的remove.list会被当作空字符串,grepl("", x)对所有非NA字符串都返回TRUE,因此!grepl(...)全为FALSE,导致所有行被过滤。
修正后的代码
1. base R 版本
# 添加ignore.case = TRUE可处理大小写差异(可选) removed <- PKV[grep(remove_list, PKV$Aufzeichnungen, invert = TRUE, ignore.case = TRUE), ]
2. dplyr + grepl 版本
library(dplyr) removed <- PKV %>% filter(!grepl(remove_list, Aufzeichnungen, ignore.case = TRUE))
3. dplyr + stringr 版本
library(dplyr) library(stringr) removed <- PKV %>% filter(!str_detect(Aufzeichnungen, regex(remove_list, ignore_case = TRUE)))
额外说明
ignore.case = TRUE是可选参数,用于匹配大小写不同的目标字符串(比如避免漏删首字母大写的"Aufgeklärt")- 空字符串行(行16)不会被当前
remove_list匹配,会保留在结果中;如果需要移除空行,可以额外添加filter(Aufzeichnungen != "")
内容的提问来源于stack exchange,提问作者KC-Migo
相关产品推荐
相关产品推荐

