2011-07-06 14 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」というラベルの付いた2つの「郵便番号」があります。何らかの理由で、政府からの元のデータセットには、他の郵便番号と適切にグループ化されていないいくつかの郵便番号 があります。 「AlabamaZipCode」タグを持っていない私は、キーワードのリスト全体を反復処理し、数値ですべての行を削除できるか知りたいと思った

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文字 値として保存されています) 。だから、以前のデータは似たようになるはずです。

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 

私が保持したい数値と削除したい数値があるようです。 誰でも手伝ってください。

答えて

10

私は2つの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 

あなたはここにあなたが考えることができる1つ(少し複雑)なアプローチだ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))) 
[1] NA NA 50143 NA NA 52348 54023 54024 
Warning message: 
In eval(expr, envir, enclos) : NAs introduced by coercion 

:私たちはこれを与え

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

またはそれを抑制するが、それは問題をマスクすることができるようにさりげなく、これを使用しない:

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

最後のステップは、ないNA"AlabamaZipCode"に等しいkeywordを有するwantの要素を選択することであるが、これ我々は&を使用してください:私たちは望んでいないので、我々は上記を否定する必要があり、AN FALSETRUEを回して行を選択し

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

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

keywordと「市」の数字がある行を排除しています。まず、各行にID列を作成します。これはサブセッティングに役立ちます。次に、あなたの基準に一致する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))))) , ] 
関連する問題