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

时间:2016-01-04 16:20:38

标签: r loops csv data-manipulation

我在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列表。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:2)

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

使用此数据(您的示例在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以在匹配时替换为空。