作者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/cn.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