2016-01-04 48 views
2

我在R中编程以处理Csv和数据操作如果在我的csv中有字符串匹配,我试图插入空值。删除基于字符串匹配的数据 - R

我的CSV如下:

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

,我想通过我的CSV看bad_names的名单bad_names < - C( “空白”, “没有”, “坏”,“老“)

一旦我通过我的CSV寻找bad_name字符串匹配循环,我想输出是

first_name last _name zip_code 
    Ben   Smith  12345 
       Johnson 23456 
    Carrie     34567 

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

感谢您提供任何帮助!

+4

尝试:df $ first_name [df $ first_name%in%bad_names] < - '' – Gopala

+0

如果遇到区分大小写问题,您可能需要在first_name列上使用'tolower()'。 – Gopala

+1

其实,如果你有因素,上述提供的方法将无法正常工作。更何况这只是一个专栏。也许增加'dput' –

回答

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应用到它们的值上以替换为空匹配。

+0

这就是完美@Tensibai!非常感谢你的帮助! – Maddie