【问题标题】:Delete data based on string match - R根据字符串匹配删除数据 - R
【发布时间】:2016-04-08 07:33:10
【问题描述】:

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

我的CSV如下:

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

我想通过我的 csv 查看的 bad_names 列表是 bad_names

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

    first_name  last _name zip_code
    Ben         Smith      12345
               Johnson    23456
    Carrie                 34567

所以它不会删除整行,而只会删除匹配的行。我正在努力只删除条目,而不是整行,并遍历整个 bad_names 列表。

感谢您提供的任何帮助!

【问题讨论】:

  • 尝试:df$first_name[df$first_name %in% bad_names]
  • 如果您有区分大小写的问题,您可能需要在 first_name 列上使用 'tolower()'。
  • 其实,如果你有因素,上面提供的方法是行不通的。更不用说这仅适用于一列。也许添加一个dput
  • 使用NA 可能比使用空字符串更有意义,并且可能在read.csv() 中使用stringsAsFactors = FALSE。

标签: r loops csv data-manipulation


【解决方案1】:

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

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

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 是类字符一样工作,如果你想混合它们,你必须做一些不同的事情(这里不再复制模式构造):

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

这个想法是找到作为字符的列并将 gsub 应用于它们的值以在匹配时替换为空。

【讨论】:

  • 那是完美的@Tensibai!非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 2012-03-12
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多