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

640?wx_fmt=gif


640?wx_fmt=jpeg

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


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


在前面

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


题:批量处理表中变量

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


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

640?wx_fmt=png

我们要做的是第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)]

结果如下:

640?wx_fmt=png

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


首先,我们看 ':=' 的右边。我们知道在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,下面来看看运行结果:

640?wx_fmt=png

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

DT[, colnames(.SD)]

输出结果如下:

640?wx_fmt=png

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


期预告

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

640?wx_fmt=gif


往期精彩:

640?wx_fmt=jpeg

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值