0

traffic次のような名前のファイルが1つあります。

city statenum casenum vnumber pnumber county accdate accday accmin accmon acctime
-1       6      23       1       1     47 1082010      8     50      1     150
0        6      25       1       1     73 1042010      4      0      1    2200
0        6     652       1       4     71 3282010     28      1      3    1901
1        6    1289       1       2     71 7152010     15     40      7    2140
4        6    1289       1       3     71 7152010     15     40      7    2140
1        6    1289       1       4     71 7152010     15     40      7    2140

そして、各列の数値コードが何を指しているかを教えてくれる一連の個別のファイル。たとえば、city次のようなファイルがあります。

Code     Definition
-1       Blank
0        NA
1        ACAMPO
2        ACTON
3        ADELANTO
4        ADIN

cityファイル内のコードを使用して、のコード化された値を置き換えるにはどうすればよいtrafficですか?出力は次のようになります。

city statenum casenum vnumber pnumber county accdate accday accmin accmon acctime
Blank     6      23       1       1     47 1082010      8     50      1     150
NA        6      25       1       1     73 1042010      4      0      1    2200
NA        6     652       1       4     71 3282010     28      1      3    1901
ACAMPO    6    1289       1       2     71 7152010     15     40      7    2140
ADIN      6    1289       1       3     71 7152010     15     40      7    2140
ACAMPO    6    1289       1       4     71 7152010     15     40      7    2140

私がrecodeを使用して見たすべての解決策は、carsパッケージの例のように、どの値がどの値に対応するかを明示的に示すことを含みます。代わりに、 ifmatchesの数値コードを文字recode(x, "c(1,2)='A'; else='B'")列に置き換えます。city$Definitiontraffic$citycity$Codetraffic$city

私は時々行うことができましたがtraffic<-merge(traffic, city, by.x = "city", by.y = "Code")、これはこれを行うための便利な関数があるのに十分な一般的な操作であるように思われます。traffic$city<-traffic$Definitiontraffic$Definition<-NULL

何度も繰り返すことなく、複数の列を複数のファイルの値に置き換えることができるソリューションのボーナスポイント。

4

2 に答える 2

3

これは多分あなたが望むものです

traffic<-read.table(header=T,text="city statenum casenum vnumber pnumber county accdate accday accmin accmon acctime
-1       6      23       1       1     47 1082010      8     50      1     150
0        6      25       1       1     73 1042010      4      0      1    2200
0        6     652       1       4     71 3282010     28      1      3    1901
1        6    1289       1       2     71 7152010     15     40      7    2140
4        6    1289       1       3     71 7152010     15     40      7    2140
1        6    1289       1       4     71 7152010     15     40      7    2140")

city<-read.table(header=T,text="Code     Definition
-1       Blank
0        NA
1        ACAMPO
2        ACTON
3        ADELANTO
4        ADIN")

traffic$city<-city$Definition[match(traffic$city,city$Code)]

しかし、私はあなたの意味を誤解しているかもしれません

またははるかに楽しい

library(sqldf)
sqldf("SELECT c.Definition,t.statenum,t.casenum,t.vnumber,t.pnumber,t.county,t.accdate,t.accday,t.accmin,t.accmon from traffic t, city c where t.city=c.Code")

おそらくあなたの最後の部分に答えるために、sqldfとSQLタイプのSELECTSを提唱します。ただし、大きなデータフレームでのパフォーマンスについてはコメントできません。

編集:ここに入れたいのSELECT c.Definition as city.....ですが、エラーがスローされます

于 2012-07-07T21:38:33.440 に答える
2

おそらく最も簡単な方法は、ルックアップ テーブルの列の名前を変更して、マージ操作が「機能する」ようにすることです。

names(city) <- c("city", "City Name")
merge(traffic, city)

  city statenum casenum vnumber pnumber county accdate
1   -1        6      23       1       1     47 1082010
2    0        6      25       1       1     73 1042010
3    0        6     652       1       4     71 3282010
4    1        6    1289       1       2     71 7152010
5    1        6    1289       1       4     71 7152010
6    4        6    1289       1       3     71 7152010
  accday accmin accmon acctime City Name
1      8     50      1     150     Blank
2      4      0      1    2200      <NA>
3     28      1      3    1901      <NA>
4     15     40      7    2140    ACAMPO
5     15     40      7    2140    ACAMPO
6     15     40      7    2140      ADIN

sqldfこれはリレーショナル データベースで期待される構造であるため、やを使用したい場合は簡単になりますdata.table

于 2012-07-08T06:23:15.780 に答える