用data.table语句批量处理变量

浏览: 1383

村长,数据科学、指弹吉他及录音工程爱好者,浙大金融学博士在读,在data.table包和MongoDB的使用上有较多经验。

转载自公众号:大猫的R语言课堂

在前面

本期“大猫R语言公众号”仍由“村长”供稿。村长继续为大家奉上data.table使用案例心得,希望大家能够继续支持村长!!

题:批量处理表中变量

正式开始说问题之前,我们先回顾一下data.table的基本语句DT[i, j, by],简而言之,"i"是对行进行选择,"j"是对列进行操作,"by"是分组。我们现在要对列进行操作(转换类型),因此本期是关于“j”的内容。

下面正式开始,笔者在帮他人处理数据时遇到了需要同时为一系列变量进行相同处理,先来看数据结构:

我们要做的是第3个变量“除权除息日[报告期]2010年一季”开始,一直到第34个变量,将这些变量全部转化为Date格式

观处理法:分别处理每一个变量

大家最直观的处理方法,肯定是把每一个变量写在j中然后分别进行日期格式的修改,诸如如下形式:

DT[, ':='(`除权除息日\r\n[报告期] 2010一季` = as.Date(`除权除息日\r\n[报告期] 2010一季`, ....))]

不知道大家对这种写法怎么看,笔者是完全无法忍受这样的代码的。首先,变量的数量实在太多,如果输这34个变量名尚且能接受的话,那万一要是有100个变量呢,“输”了你赢了世界又如何;再者,未经过清洗和结构化的变量名存在着太多难以预计的问题,我们来看代码中这个示例的变量名:`除权除息日\r\n[报告期] 2010一季`,这是一个非常脏的原始数据变量名,除了变量名是中文,需要用``符号进行引用以外,中间还有不知道什么时候会冒出来的空格、换行符等等,笔者也是试了好几次才真正将变量名输入正确。只能说我“输”了,但你肯定是怕了...

量处理法:用lapply批量处理变量

在此时lapply的妙用就显现出来了,在R中lapply用来对list中每一个element进行相同处理,如何把它运用到data.table,话不多说先上代码:

DT[, colnames(DT[, 3:34]) := lapply(.SD[, 3:34], as.Date)]

结果如下:

下面就让笔者来为大家解释这一段代码:

首先,我们看 ':=' 的右边。我们知道在data.table包中,.SD是经过i和by处理之后剩下的那部分数据集,它的格式是一个data.table,同时它是一个list。而我们要处理的变量是第3个到第34个,所以在.SD中选出3至34列,运用lapply对选中的.SD[, 3:34]里面每一个element使用as.Date函数

再看,':='的左边。如何把处理好的这些变量与变量名进行对应,这里就用到了colnames()这个函数,提取出我们这个data.table第3到第34个变量的名字,这样就可以将变量名和更改格式后的变量按顺序进行一一匹配

意事项:.SD用法

可以说.SD是data.table处理中非常重要的一个用法,但也切勿乱用,在这里笔者发现了一个关于.SD的问题,首先我们改一下代码:

# 将 := 左边的DT改成.SD ----

DT[, colnames(.SD[, 3:34]) := lapply(.SD[, 3:34], as.Date)]

我们将 := 左边的DT改成了.SD,下面来看看运行结果:

运行有报错,这就需要注意.SD的用法了,我们首先看报错提示语句的意思是::=的左边并不是字符、整数或者数值格式。为了更加深入认识这个问题,我们下边再写一段代码,用.SD方法输出的colnames:

DT[, colnames(.SD)]

输出结果如下:

输出结果非常正常,那么只能证明一点:.SD不能用在 := 的左边!!!大家在运用的过程中必须要注意。

期预告

下期的大猫R语言课堂还是由村长来进行撰写和推送,届时将会给大家带来一个比较有趣的data.table发现,敬请期待!!

往期精彩:


公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册