2016-01-04 76 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