質問
約40列のデータフレーム、2番目の列、データ[2]には、残りの行データが説明する会社の名前が含まれています。ただし、企業の名前は年によって異なります(2009年のデータでは09、2010年には何もありません)。
私は両方の年を一度に引き込むことができるようにデータをサブセットすることができるようにしたいと思います。これが私がやろうとしていることの例です...
subset(data, data[2] == "Company Name 09" | "Company Name", drop = T)
基本的に、サブセット関数内でORオペレーターを使用するのが困難です。
しかし、私は他の選択肢を試しました:
subset(data, data[[2]] == grep("Company Name", data[[2]]))
おそらく、文字列関数を使用して簡単に行う方法がありますか?
どんな考えも評価されます。
解決
まず第一に(ジョナサンが彼のコメントで行ったように)2番目の列を参照するには、どちらも使用する必要があります data[[2]]
また data[,2]
. 。ただし、サブセットを使用している場合は、列名を使用できます。 subset(data, CompanyName == ...)
.
そして、あなたの質問のために、私は次のうちの1つをします
subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE)
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)
2番目に使用します grepl
(Rバージョン2.9で導入)は、論理ベクトルをで返します TRUE
マッチ用。
他のヒント
いくつかのこと:
1)モックアップデータは、あなたが何に直面しているのか正確にわからないため有用です。可能であればデータを提供してください。たぶん私は何が続くのか誤解しましたか?
2)使用しないでください [[2]]
data.frameをインデックスするために、[、 "colname"]ははるかに明確だと思います
3)唯一の違いが名前の後続の「09」である場合、単にそれを再現します:
R> x1 <- c("foo 09", "bar", "bar 09", "foo")
R> x2 <- gsub(" 09$", "", x1)
[1] "foo" "bar" "bar" "foo"
R>
これで、オンザフライ変換されたデータでサブセットを実行できるはずです。
R> data <- data.frame(value=1:4, name=x1)
R> subset(data, gsub(" 09$", "", name)=="foo")
value name
1 1 foo 09
4 4 foo
R>
また、名前列をregexp'ed値に置き換えることもできます。