如何使用一个数据帧中的值来重新编码另一个数据帧中的值?

时间:2012-07-07 21:31:08

标签: r variables

我有一个名为traffic的文件,如下所示:

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

我所见过的所有解决方案都使用了重新编码或同样涉及明确说明哪个值对应于cars包示例中的哪个:recode(x, "c(1,2)='A'; else='B'")我想要做的是,而是如果city$Definitiontraffic$city匹配,则city$Code中的字符串会替换traffic$city中的数字代码。

我可以traffic<-merge(traffic, city, by.x = "city", by.y = "Code")然后traffic$city<-traffic$Definition然后traffic$Definition<-NULL,但这似乎是一个足够普通的操作,可以有一个方便的功能来执行此操作。< / p>

解决方案的奖励积分,允许我指定多个列替换为多个文件中的值而不会重复太多。

2 个答案:

答案 0 :(得分: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.....,但它会抛出错误

答案 1 :(得分: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

由于这是人们在关系数据库中所期望的结构,因此如果您希望使用sqldfdata.table,这应该会很容易。