我有一个名为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$Definition
与traffic$city
匹配,则city$Code
中的字符串会替换traffic$city
中的数字代码。
我可以traffic<-merge(traffic, city, by.x = "city", by.y = "Code")
然后traffic$city<-traffic$Definition
然后traffic$Definition<-NULL
,但这似乎是一个足够普通的操作,可以有一个方便的功能来执行此操作。< / p>
解决方案的奖励积分,允许我指定多个列替换为多个文件中的值而不会重复太多。
答案 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
由于这是人们在关系数据库中所期望的结构,因此如果您希望使用sqldf
或data.table
,这应该会很容易。