0

我有一个名为的文件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

我使用 recode 看到的所有解决方案或同样涉及明确说明哪个值对应于cars包示例中的哪个值:recode(x, "c(1,2)='A'; else='B'")相反,我想做的是让字符串city$Definition 替换traffic$cityif city$Codematches中的数字代码traffic$city

我可以做traffic<-merge(traffic, city, by.x = "city", by.y = "Code")and traffic$city<-traffic$Definitionthen traffic$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

由于这是关系数据库中期望的结构,因此如果您希望使用sqldfor ,这应该很容易data.table

于 2012-07-08T06:23:15.780 回答