根据字符串匹配删除数据 - R

Delete data based on string match - R

我正在使用 R 进行编程以处理 Csv 和数据操作如果与我的 csv 中的字符串匹配,我将尝试插入空值。

我的CSV如下:

    first_name  last _name zip_code
    Ben         Smith      12345
    Blank       Johnson    23456
    Carrie      No         34567

我想通过我的 csv 查看的 bad_names 列表是 bad_names <- c("blank", "no","bad", "old")

一旦我遍历 csv 寻找 bad_name 字符串匹配,我希望输出为

    first_name  last _name zip_code
    Ben         Smith      12345
               Johnson    23456
    Carrie                 34567

因此它不会删除整行,而只会删除匹配的行。我正在努力删除条目,而不是整行,并遍历 bad_names.

的整个列表

感谢您提供的任何帮助!

正则表达式匹配的另一个选项:

使用此数据(您的示例在 last _name header 中有错误):

data<-read.table(text="first_name last_name zip_code
Ben         Smith      12345
Blank       Johnson    23456
Carrie      No         34567",header=TRUE)

注意:如果它是一个因素,我没有使用 stringAsFactors=FALSE 来展示我是如何管理它的,如果不是,请去掉 sapply 调用

bad_names <- c("blank", "no","bad", "old")
pat=paste0("(?i)\b",paste0(bad_names,collapse="\b|\b"),"\b")
t<-sapply(data,as.character)
gsub(pat,'',t)

我使用 sapply 从因子到字符的转换,快速而肮脏,因为它将所有转换为字符,有 better approach.

这里的技巧是使用 paste0 的正则表达式构造,我们创建 bad_words 的交替(由 | 分隔)并用 \b 包围它们以确保它是整个匹配的单词不只是任何单词的一部分。

然后我们全局替换 (gsub) 任何匹配项。

给出:

     first_name last_name zip_code
[1,] "Ben"      "Smith"   "12345" 
[2,] ""         "Johnson" "23456" 
[3,] "Carrie"   ""        "34567" 

这是因为整个 data.frame 是 class 字符,如果你想混合它们,你必须做一些不同的事情(不要再次复制这里的模式构造):

f<-sapply(data,is.character)
data[,f]<-lapply(data[,f],gsub,pattern=pat,replacement='')

想法是找到字符列并在它们的值上应用 gsub 以在匹配时用空替换。