作者joson4921 (特務)
看板R_Language
標題[問題] 兩資料集merge,求解為何出現NA和解決之道
時間Sat Feb 4 18:01:42 2017
- 問題:
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
BaseLine.csv:https://goo.gl/Zdq00K
TmpCalcuBusNo._V0.csv:https://goo.gl/SWmaUh
如題,手邊有兩個經過整理的資料集「BaseLine.csv」「TmpCalcuBusNo._V0.csv」
兩資料集內分別有4個相同的欄位名稱: Gobackx, From, Toward, Bus_No
我想把「BaseLine.csv」的「Tmp_TravelTime」欄位資料merge過去TmpCal那個csv
然後另存成新資料集「TimeCalcu_temp」,所使用的程式碼如下:
TimeCalcu_temp <- merge( TmpCalcu_BusNo._V0, BaseLine,
by = c("Gobackx","Toward","From","Bus_No") ,all.x = TRUE)
檔案是有照我想要的方式merge起來了,如新資料集第一筆所示:
Gobackx Toward From Bus_No => Tmp_TravelTime
0 五權學士路口 莒光新城 12 => 27
回頭去找「BaseLine.csv」確認,
根據上述 Gobackx, Toward, From, Bus_No找到對應資料:BaseLine.csv第854筆
該筆資料之 Tmp_TravelTime = 27 無誤
但是可以發現另存成的新資料集 TimeCalcu_temp 的 Tmp_TravelTime 出現大量NA值
我想知道是否 merge 函數使用有誤,致無法得出我想要的結果呢?
還請板上大大協助run一下資料集看看問題出在哪裡,先謝謝大家了!!!!
[程式範例]:
[環境敘述]:
請提供 sessionInfo() 的輸出結果,
裡面含有所有你使用的作業系統、R 的版本和套件版本資訊,
讓版友更容易找出錯誤
[關鍵字]:
merge
選擇性,也許未來有用
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.136.217
※ 文章網址: https://webptt.com/m.aspx?n=bbs/R_Language/M.1486202506.A.4DF.html
※ 編輯: joson4921 (140.113.136.217), 02/04/2017 18:04:33
1F:→ celestialgod: all.x = TRUE 出錯吧 02/04 20:04
2F:→ celestialgod: 你保留全部的左表,沒有mapping到的當然是NA 02/04 20:04
3F:→ joson4921: 不是這樣的,以新建的資料集第4874筆來說,該筆資料Gobac 02/04 21:05
4F:→ joson4921: Gobackx=0,Toward=大東紡織(振興路),From=莒光新城, 02/04 21:06
5F:→ joson4921: Bus_No=3,根據這些資料去找BaseLine是可以找到對應的 02/04 21:08
6F:→ joson4921: Tmp_TravelTime=1723,而且仔細一看會發現BaseLine裡面 02/04 21:09
7F:→ joson4921: 當Gobackx=0,From=莒光新城,Toward=大東紡織(振興路)時 02/04 21:11
8F:→ joson4921: Bus_No欄位=3~62都有資料,但新增的資料集裡面全是NA 02/04 21:12
9F:→ joson4921: 我也搞不懂為什麼會這樣,左表map出來17.4萬筆資料裡面 02/04 21:15
10F:→ joson4921: 有9萬筆資料是NA...而且隨便抓都是BaseLine有的資料,又 02/04 21:17
11F:→ joson4921: 不是不存在的資料,真的很抱歉再麻煩板上大大看看哪裡出 02/04 21:18
12F:→ joson4921: 問題,拜託了!!謝謝!! 02/04 21:18
15F:→ celestialgod: Y是多打得 02/04 21:41
16F:→ celestialgod: Note: 我的data.table是 1.10.1 02/04 21:42
17F:→ celestialgod: R是MRO 3.3.1,windows 10 64bit 02/04 21:42
18F:→ joson4921: 了解…待會再確認看看版本有沒有影響@@ 02/04 23:34
見鬼了...
http://imgur.com/IJ25uLX
下面是用我原本的程式去讀 TmpCalcu_BusNo._V0, BaseLine 這兩個資料集
上面是仿照c大的直接讀取我傳給c大的csv
明明都是那兩個data.table的東西
為什麼c大讀我輸出的csv就可以,結果我自己直接讀的就不行
...
...所以我就敲了class()進去試,結果
http://imgur.com/C2lryP7
c大輸入用的DT2跟DT1是同樣的格式:
> class(DT2)
[1] "data.table" "data.frame"
> class(DT1)
[1] "data.table" "data.frame"
我的 TmpCalcu_BusNo._V0 跟 BaseLine 的格式是:
> class(TmpCalcu_BusNo._V0)
[1] "data.table" "data.frame"
> class(BaseLine)
[1] "grouped_df" "tbl_df" "tbl" "data.frame"
所以問題是出在格式不對嗎-.-
然後剛剛試著用as.data.frame(BaseLine)去轉,可是class()出來發現格式沒有變
...所以是我的BaseLine產生過程有問題嗎?
附上BaseLine產生的程式碼如下:
http://imgur.com/qrP8Ntq
救命...
※ 編輯: joson4921 (1.161.166.207), 02/05/2017 01:01:58
※ 編輯: joson4921 (1.161.166.207), 02/05/2017 01:02:38
19F:→ Wush978: 用 as.data.frame 或直接 class(BaseLine) <- "data.fram 02/05 02:01
20F:→ Wush978: e" 看看呢? 02/05 02:01
http://imgur.com/aBkpMic
有試著用W大的方法去改了,指定進去之後BaseLine確實變成了"data.frame"
但後面merge起來的結果並沒有因此改變,無法做到先把資料輸出成csv再讀入一樣的結果
...我只剩下輸出成csv再讀入做後續運算這條路了嗎-.-|||
※ 編輯: joson4921 (1.161.166.207), 02/05/2017 02:35:20
21F:→ celestialgod: BaseLine <- as.data.table(BaseLine) ? 02/05 02:43
22F:→ celestialgod: 我猜問題是因為是merge.data.table跟 02/05 02:44
23F:→ celestialgod: merge.data.frame這兩個method有一些不同 02/05 02:44
24F:→ celestialgod: 所以沒辦法完全相容,在某些點上出問題了 02/05 02:44
25F:→ celestialgod: 先試試看都轉成data.table看看吧 02/05 02:44
26F:→ celestialgod: 或是 直接用 setDT(BaseLine) 02/05 02:44
27F:→ celestialgod: 然後再試一次 02/05 02:45
http://imgur.com/hDUlltU
上圖第一個結果是 BaseLine <- as.data.table(BaseLine)
第二個結果是 BaseLine <- setDT(BaseLine)
兩個都轉成 [1] "data.table" "data.frame" 了,但程式跑出來還是存在NA 0.0
※ 編輯: joson4921 (140.113.136.220), 02/05/2017 11:58:50
28F:→ joson4921: 暫時就先輸出再讀入吧,雖然我還是不了解哪邊出了問題@@ 02/05 14:28
29F:→ joson4921: 謝謝樓上大大們出手協助,謝謝!! 02/05 14:28