2011-07-06 42 views
3

我正在處理一些美國政府的數據,這些數據中有很長的城市和郵政編碼列表。 經過一番努力,數據格式如下。從數據框中刪除特定的行

dat1 = data.frame(keyword=c("Bremen", "Brent", "Centreville, AL", "Chelsea, AL", "Bailytown, Alabama", "Calera, Alabama", 
       "54023", "54024"), tag=c(rep("AlabamCity",2), rep("AlabamaCityST",2), rep("AlabamaCityState",2), rep("AlabamaZipCode",2))) 
dat1 

但是,有某些關鍵字不能正常工作。所以在下面的例子中,有兩個'郵政編碼',其中 被標記爲'AlabamaCity'和'AlabamaCityState'。由於某些原因,政府提供的原始數據集有幾個郵政編碼 ,這些郵政編碼與其他郵政編碼沒有正確分組。

dat2 = data.frame(keyword=c("Bremen", "Brent", "50143", "Chelsea, AL", "Bailytown, Alabama", "52348", 
       "54023", "54024"), tag=c(rep("AlabamCity",2), rep("AlabamaCityST",2), rep("AlabamaCityState",2), rep("AlabamaZipCode",2))) 
dat2 

我想知道我怎麼會通過關鍵詞的整個列表進行迭代,並刪除所有與數字值的行(他們acctually保存字符 值)不具有「AlabamaZipCode」標籤。所以之前的數據應該看起來像。

dat3 = data.frame(keyword=c("Bremen", "Brent", "Chelsea, AL", "Bailytown, Alabama", "54023", "54024"), 
      tag=c(rep("AlabamCity",2), rep("AlabamaCityST",1), rep("AlabamaCityState",1), rep("AlabamaZipCode",2))) 
dat3 

challange似乎是有某些我想保留的數值和我想刪除的其他數值。 任何人都可以幫忙。

回答

10

,我覺得兩部grepl表達式應該這樣做:

> dat2[ !(grepl("City", dat2$tag) & grepl("^\\d", dat2$keyword)) , ] 
      keyword    tag 
1    Bremen  AlabamCity 
2    Brent  AlabamCity 
4  Chelsea, AL AlabamaCityST 
5 Bailytown, Alabama AlabamaCityState 
7    54023 AlabamaZipCode 
8    54024 AlabamaZipCode 

您消除凡是有keyword和「城市」 tag

5

它有助於數據存儲爲字符,而不是因素:

dat2 <- data.frame(keyword=c("Bremen", "Brent", "50143", "Chelsea, AL", 
          "Bailytown, Alabama", "52348", "54023", "54024"), 
        tag=c(rep("AlabamCity",2), rep("AlabamaCityST",2), 
         rep("AlabamaCityState",2), rep("AlabamaZipCode",2)), 
        stringsAsFactors = FALSE) ## note this bit 

現在,我們可以轉換到keyword數字,如果不是字符格式的數字,我們得到了一個NA

want <- with(dat2, as.numeric(keyword)) 

這給了我們這樣的:

> (want <- with(dat2, as.numeric(keyword))) 
[1] NA NA 50143 NA NA 52348 54023 54024 
Warning message: 
In eval(expr, envir, enclos) : NAs introduced by coercion 

可以忽略警告或抑制,但不使用此隨便,因爲它可以掩蓋問題:

suppressWarnings(want <- with(dat2, as.numeric(keyword))) 

的最後一步是選擇那些不NA具有keyword等於"AlabamaZipCode"want的元件,其我們使用&

(!is.na(want) & (dat2$tag != "AlabamaZipCode")) 

那選擇我們不想行,所以我們要否定上面,把TRUEFALSE的d反之亦然:

!(!is.na(want) & (dat2$tag != "AlabamaZipCode")) 

把這個,我們一起有:

dat2[!(!is.na(want) & (dat2$tag != "AlabamaZipCode")), ] 

這給:

> dat2[!(!is.na(want) & (dat2$tag != "AlabamaZipCode")), ] 
      keyword    tag 
1    Bremen  AlabamCity 
2    Brent  AlabamCity 
4  Chelsea, AL AlabamaCityST 
5 Bailytown, Alabama AlabamaCityState 
7    54023 AlabamaZipCode 
8    54024 AlabamaZipCode 

完整的解決方案是:

want <- with(dat2, as.numeric(keyword)) 
dat2[!(!is.na(want) & (dat2$tag != "AlabamaZipCode")), ] 
1

數字下面是你可以考慮一個(略曲)方法的行。首先,爲每一行創建一個標識列。這將有助於子集。其次,創建一個符合你的標準的id的矢量。最後,將這些ID從你的最終數據中分類出來。

您發佈的數據默認爲因素,而不是字符數據,所以我已經說明了這一點。如果這與實際數據不同,則必須相應進行調整。另外,當我將數據轉換爲數字時,會生成NAs。會生成一條警告消息,但我們可以忽略該位。

#Generate an ID column 
dat4$id <- 1:nrow(dat4) 

#Create a vector of the id's that match your criteria' 
outliers <- dat4[as.character(dat4$tag) != "AlabamaZipCode" & !(is.na(as.numeric(as.character(dat4$keyword)))) , "id"] 

subset(dat4, !(id %in% outliers), select = 1:2) 
      keyword    tag 
1    Bremen  AlabamCity 
2    Brent  AlabamCity 
4  Chelsea, AL AlabamaCityST 
5 Bailytown, Alabama AlabamaCityState 
7    54023 AlabamaZipCode 
8    54024 AlabamaZipCode 

其實,你可以縮短所有這些,以避免生成id。

dat4[!(as.character(dat4$tag) != "AlabamaZipCode" & !(is.na(as.numeric(as.character(dat4$keyword))))) , ]