2012-07-07 32 views
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 

所有的解決方案我已經看到了使用轉碼或同樣涉及到明確說明其價值相當於其作爲cars包例子:recode(x, "c(1,2)='A'; else='B'")我想要做什麼,而不是,如果city$Codetraffic$city匹配,則使用city$Definition中的字符串替換traffic$city中的數字代碼。

我可以做traffic<-merge(traffic, city, by.x = "city", by.y = "Code")然後traffic$city<-traffic$Definition然後traffic$Definition<-NULL,但它似乎是這將是一個常見的足夠的操作,將有一個方便的功能來做到這一點。

一個解決方案的加分點,它允許我指定多個列以被多個文件中的值替換,而不用重複太多。

+0

提供的匹配解決方案肯定似乎是我會嘗試的方法。您在最後一句中提出的解決方案請求顯得過於模糊。爲什麼不張貼另一個問題,提供一個更具體的起點? – 2012-07-07 21:50:11

+0

讓我讓最後一部分更清楚 - 我擁有的文件不僅僅是「城市」。我希望能夠對各個城市和縣進行重新編碼,並且從他們各自的文件中確定各自的價值,而不必爲每個文件單獨編寫一份匹配聲明。雖然可能比它的價值更多的努力。 – 2012-07-07 22:13:40

+0

這不是'merge'的明顯例子嗎?細節(如先前所建議的那樣需要確定。 – 2012-07-08 01:38:04

回答

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類型什麼選擇如下部分作爲也許回答你最後部分。但是,我不能評論它如何與大型數據幀一起執行。

編輯: 我想有SELECT c.Definition as city.....在這裏,但它拋出一個錯誤

+0

啊哈,我正在使用匹配解決方案的蹤跡。你也可以把它寫成'traffic $ city <-city $ definition [city $ Code%in%traffic $ city]'對嗎?任何建議從多個文件做多個變量替換? – 2012-07-07 21:48:39

+0

謝謝,我還沒有開始使用sqldf,但我知道有很多人最終在那裏,特別是他們的數據變得更大,所以應該可以繼續使用它;-) – 2012-07-07 23:20:36

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

相關問題