10

約40列のデータフレームがあります。2番目の列であるdata[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]]))

おそらく、文字列関数を使用してそれを行う簡単な方法がありますか?

どんな考えでも感謝されるでしょう。

4

2 に答える 2

18

まず、(ジョナサンがコメントで行ったように)2番目の列を参照するには、またはのいずれかを使用する必要がありdata[[2]]ますdata[,2]。ただし、サブセットを使用している場合は、列名を使用できますsubset(data, CompanyName == ...)

そしてあなたの質問のために私は次のいずれかを行います:

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)

grepl次に、一致する論理ベクトルを返す(Rバージョン2.9で導入された)を使用しTRUEます。

于 2010-01-24T12:09:44.057 に答える
5

いくつかのこと:

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> 

名前の列を正規表現の値に置き換えることもできます。

于 2010-01-23T23:59:35.593 に答える