Categories
日常应用

ODBC(Teradata)和R连接常见问题

以前总结了一些R、SAS和TD彼此之间数据导入导出的办法,可是实际使用中还是会碰到各种各样的问题...问的人多了,就多少攒出一些FAQ放在了内部的wiki上。

还有一些问题估计大家都会遇到,所以也摘到blog上来好了。一开始用英文写的,简单翻译一下,不全翻译了。首先是通过RODBC连TD的一些常见问题,不知道是不是通用于其他ODBC driver...

  • Q: I cannot load RODBC on my own computer (not on R servers)... what can I do?
    A: Try to debug in these steps -1)  Check if you have installed the 64-bit version of Teradata ODBC driver on your 64-bit OS. If not, download and install these three packages here: http://downloads.teradata.com/download/connectivity/odbc-driver/windows(保证R、操作系统和ODBC driver位数一致,如果是64位的操作系统就装一套儿64位的吧...上面那个link是64位TD ODBC Driver的下载地址)。2)  Open your 64-bit ODBC administrator and configure the TD server DNS. (在新的ODBC中配置server地址) 

    3)  Close and re-open R again. (重启R,这步一定不能省)
    4)  If you still have problems, use R 2.*** instead of R 3.0+ (R 3.0以上版本有时候会莫名其妙报错,如是,改用2.15+版本吧。)

  • Q: How can I call R in the command line (to schedule a recurring job)? (怎么run batch job?)
    A: You can call RScript directly in your command line. If failure, you need to add R's path to your system environment variable - PATH. e.g. C:\Program Files\R\R-2.15.2\bin (设一下环境变量)
    Pay attention to its parameters. Also, you can save the log. A sample command is as follows - (命令行类似如下)

    Rscript --no-save --no-restore --verbose "/home/Liyun.Chen/R/recurring/recurring_dashboard_by_week.r" > outputFile.log 2>&1

    (记得存个log)

暂时就是这些...做个存档好了。

Categories
日常应用

从词频统计到词频矩阵(善用sparse matrix)

今天在下手写一个算text similarity的程序时,万般痛恨tm包不争气,而lijian哥的tmcn包又还木有完工,所以只能自己从头开始写了...

一切正常,基本的清洗啊,全角换半角啊,分词啊,去stop words啊几行代码顺利搞定,结果统计完了每行的词频却找不到一个有效的办法来算词频矩阵!数据也就是那么几万行嘛...reshape2怎么一下子就挂了呢?研究了一番,想到就算搞出来一个几万乘几万的词频矩阵,后面的distance之类也算不出来...悲哀的感觉充斥。没办法,只能祭出sparse matrix这面大旗了!

Google之,R里面可以调用Matrix或者SparseM。鉴于前者看起来比较简单的样子,我就没有去折腾后者。Matrix里面Sparse Matrix的定义比较简单,就是记录一下值不为0的行和列编号,以及他们对应的值就可以了。等等,这个东西怎么听起来这么熟悉?!好像在network analysis里面整天写这样的程序嘛!对嘛,不就是一个edgelist格式的network(记录相互连接的边)转换为一个matrix格式的网络(边边矩阵)嘛!瞬间有种打通任督二脉的感觉....

这样,只要我数出来每篇文章中的词频就足够了! 形如:
Post_id word count
1.           A.       1
1.           B.       2

这样,然后

sparseMatrix(as.factor(data$Post_id),
as.factor(data$word),
data$count)

就ok啦。超级高效!瞬间秒杀。根本不用去算真正的词频矩阵。

附这个函数的用法:

sparseMatrix(i = ep, j = ep, p, x, dims, dimnames,
             symmetric = FALSE, index1 = TRUE,
             giveCsparse = TRUE, check = TRUE)

同样的,dim()还是可以用来看维度,一般没错的。

再后面就是考验大家具真学得好不好的时候啦。比如方差这种东西,不就是 XX'嘛(当然要先减一下均值....),这里Matrix这个包有tcrossprod()可直接算XX',colsum这些也都还有...正常的矩阵乘法也都还可以用。关键是,QR分解什么的也有!

于是乎我可以深深满足的继续码下面的分析去了...

--------------------吐槽分割线------------------
作为一个经济学出身的孩子,我做梦也没想到有一日我居然会去碰稀疏矩阵这种东西...没办法,生活所迫呀!自己动手,丰衣足食.... T_T

Categories
日常应用

R的outreg:输出回归结果表格via stargazer

大概被这个问题折磨的最多的人就是搞econometrics的人吧...熟悉stata的人应该都很喜欢outreg这个功能,而R里面就麻烦得多。以前一直写一个outreg()的函数来搞定这件事儿,现在看来有更方便的方法了——stargazer这个包。什么AER、QJE之类的完全不在话下。

stargazer_regression

这个包支持这些对象:

lm, glm, svyglm, plm, betareg, gee, gam, polr, survreg , coxph, tobit (AER), ivreg (AER), zeroinfl (pscl), hurdle (pscl), multinom (nnet), as well as their implementations in Zelig

还支持这些期刊的表格格式:

American Economic Review, in the Quarterly Journal of Economics, or in Administrative Science Quarterly. Political scientists can avail themselves of templates based on the American Political Science Review, the American Journal of Political Science, and on International Organization. For sociologists and demographers, the American Sociological Review, the American Sociological Reviews and Demography are available.

该收收了吧,哈哈。

Categories
日常应用

从R里面底层操纵Excel/xlsx(自动化报告福音)

好吧,我在eBay折腾的最多的就是生成自动化报告时候各种软件之间的相互调用,什么R啊,SAS啊,Teradata啊,Excel啊,Python啊,反正基本都有机会相互调用一下。每到此时我就深深感慨选择一个library丰富的工具是多么的重要!You could hardly expect what you colleagues are handy with!(P.s. 不要跟我提VBA这种逆天存在的东西。有哪个时间研究它你学点啥别的不好...)

今天忍无可忍+心情大好的折腾了一下R和excel。这个不是简单的从R里面读写excel数据,而是真心用R去操纵excel里面的单元格(cell),除了读写数据之外还要定义样式什么的。excel作为一个奇葩的软件,you may never expect where people would paste data to! 然后他们再自定义一堆样式(我恨这种点点鼠标就能改的东西,你丫又不是Photoshop...)。

但是没办法,人家定义好的“高端洋气”的报表姿态你不能轻易动啊。只能乖乖的往里面paste数据。这件事虽说一次两次手动也就罢了,三五次真的是要疯掉的。anyway,万事总有解决的途径...

很久以前从Yixuan 的博客上得知有xlsx这么个包,当时只记得这东西可以读写xlsx...直到后面折腾了一下才知道这货底层居然调用的是java的xlsx API,也就是说不用写Java也可以操作xlsx了,yeah!

为了生成excel格式的自动化报告(不要问我为啥不用knitr,不用***,说起来都是泪呀!),我主要需要解决的就是:

  • 读取原有xlsx文件,保持格式、附加新格式。
  • 在相应的位置粘进去新的数据。(当然如果只有这么一个需求可以通过ODBC来做...)

第一个倒是满简单的,就是较之yixuan代码里面的createWorkbook(),改成loadWorkbook()就可以了。然后就是找到相应的sheet,这个也满简单的,一行getSheets搞定。

然后第二步建议不要去操作cell(太没效率了),直接操作cellblock。CellBlock()可以用来定义一个新的CellBlock,然后灵活运用CB.setBorder()和CB.setColData()就可以先增加边框、然后一列列填充数据。这里使用按列填充数据主要是因为R里面的Data Frame是一列一个数据格式的,一下子把一块儿都paste到excel的cellblock里面的话,会报错...BTW为了定义边框的样式,需要用到Border()。类似的还可以定义Fill和Font这些。

同上,最好不要直接用addDataFrame()来直接贴数据...格式不能覆盖。如果是要在一个新的sheet上贴数据,那么就write.xlsx(sheetName="newsheet",append=T)好了。不需要通过上述底层的API折腾了。

最后还有一个比较有用的函数,autoSizeColumn()可以用来自动调整列宽。全鼓捣完之后saveWorkbook()保存就可以啦。

最后的最后,一个珍贵的建议——都在R里面把数据整理好再去想输出到excel里面(什么reshape2啊,data.table啊,plyr啊,该上的一起上啊!),千万别手贱在excel里面改一点点小东西...每一次都手动改一下下你的时间就被白白浪费了好几分钟!珍爱生命,远离excel...

附上一段我最后搞定自动化报告的代码:

library("xlsx")
test_template <- loadWorkbook("template.xlsx") #读入template.xlsx文件。定义好各种乱七八糟的格式的。
design_tab <- getSheets(test_template)[["design"]] #转到design这个sheet。
data_block <- CellBlock(design_tab, 5,5,nrow(mydata),ncol(mydata)) #准备贴数据的方块,我这里从第5行第5列开始贴。
border <-  Border(color="black", position=c("LEFT", "RIGHT"),
pen=c("BORDER_THIN", "BORDER_THIN")) #定义边框样式——左右黑色细直线。
for (i in 1:ncol(mydata))
{
CB.setBorder(data_block, border,colIndex = i,rowIndex=1:nrow(onetime_design_tab)) #给每一列都贴上边框
CB.setColData(data_block, mydata[,i], i, rowOffset=0, showNA=F, colStyle=NULL)#给每一列贴数据
}
border_bottom <-  Border(color="black", position=c("LEFT", "RIGHT","BOTTOM"),pen="BORDER_THIN") #定义结尾行样式——底端黑细直线
data_block_bottom <- CellBlock(design_tab, 5+nrow(mydata),5,1,ncol(mydata)) #选择最后一行
CB.setBorder( data_block_bottom, border_bottom, 1, 1:ncol(onetime_design_tab)) #定义最后一行格式
autoSizeColumn(design_tab, 5:(5+ncol(onetime_design_tab)))#调整列宽
saveWorkbook(test_template, file=output_xlsx_name) #保存
##add row data
write.xlsx(rawdata, file=output_xlsx_name, sheetName="raw_data",append=T,row.names=F) #直接贴原始数据,无格式
###add queries
R_file <- readLines(R_file_name, n=-1) #直接贴R代码
SQL_file <- readLines(SQL_file_name, n=-1)
write.xlsx(SQL_file, file=output_xlsx_name, sheetName="query_SQL",append=T,row.names=F) #直接贴代码到新的sheet中
write.xlsx(R_file, file=output_xlsx_name, sheetName="query_R",append=T,row.names=F)

 


Categories
Wordpress 网站建设

落园的春日劫难

好像很规律的似的,每半年落园就要大折腾我一次...反正鼓捣wordpress这么长时间了,已然习惯了。

这次是莫名其妙的服务器宕机,然后联系客服无果(昨天才算联系到了一个人...),然后受不了网站一直挂在那里,果断搬家了(最纠结的是当时还在上海到北京的高铁上,3G+翻墙各种不稳定)。转投BlueHost的怀抱,信用卡刷刷的顺便心里小小滴一下血...

然后悲催的发现最新的备份居然是去年10月的,我...只能郁郁的先把这些文章导进去...然后开始漫天的搜,果然还是有解决策略的(隐约记得谁说过可以通过RSS恢复)。

然后第一件事儿就是去装个了备份插件,这次学乖了直接放在Google Drive上,用的是UpdraftPlus - Backup/Restore

在众多日志中觉得这个"通过Google Reader恢复WordPress日志"还算靠谱,就比着葫芦画瓢了一番。文章是恢复了,但是里面那堆Latex公式就彻底挂了...无奈之下,去看google reader直接导出来的xml(atom格式)文件,发现厚道的是公式居然还在图片的alt里面(需要先decode一下),形如这个:

<span><img src="tex_5117609d4239740f7e4072b9508c4742.gif" 
style="vertical-align:middle;border:none;padding-bottom:1px" alt="n_{L}"></span>是网络输出的个数。</li>

这样就可以直接正则表达式提取了...我是用的notepad++(试了一下R的XmltoList,但是中文全给我转成UTF8的样子让我很不爽,果断放弃了),所以输入的是

<img(.*?) alt="(.*?)">

然后替换为:

\

这样一下子就把公式又换成$$的形式了。

上面链接里的php文件有点问题,不能恢复tag。我也懒的整了,依旧是正则表达式提取:

<category term="(.*?)"/>

然后替换为半角逗号分割

\1,

好在日志不是太多,100多篇手动又检查了一遍(主要是有些图片丢了需要重新上传)。这样貌似就正常了。多说有点抽风,没法把评论备份到本地数据库了,不过现在看着还算正常我也就懒得去跟它纠结了。

暂时先这样吧,然后去恢复英文博客去...其实我对英文博客更没底儿,不知道上个备份在哪儿-_-||反正搞独立博客就是一折腾。忍了。