r语言初学者指南_R语言数据操作:练习题跟帖1

作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言数据高效处理指南》(《R语言数据高效处理指南》(黄天元)【摘要 书评 试读】- 京东图书,《R语言数据高效处理指南》(黄天元)【简介_书评_在线阅读】 - 当当图书)。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。

最近在微信中看到有使用data.table来做R练习题(renkun-ken/r-data-practice)的帖子(R练习50题 - 第一期),非常有意思。帖子的主人已经把题目全部做完,并上传到Github(Ravin515/r-data-practice)。这是一件让人开心而又悲伤的事情,这个任务如此有趣,但是这些代码是真的很难...我已经不能算是初学者了,但是看到这些data.table的代码竟是有点蒙(虽然仔细能够读懂,但是很多细节依然要查,而代码只要一个细节不对,就没有正确答案返回)。

我个人曾在多个场合以及自己的书中提到R数据操作的未来(HopeR:第十二届上海R会PPT分享:R语言数据操纵之美)。我相信R语言数据操作将会走向真正的“信达雅”,即:

信:得到正确无误的返回结果(真);

达:表达灵活自由而性能强大(快);

雅:拥有高效简洁的语法结构(美)。

以上面3个作为评判的标准,我决定跟帖对这些任务进行再实现,从而写出让初学者也能够快速掌握,而在计算机又能够高性能实现的代码。我相信未来肯定会有工具能够对以上所有的点都进行实现,但是我们只争朝夕,现在就看看当前高效的实现是如何的。这里核心思想是使用dplyr来提高代码的可读性,这样既节省了我们设计代码的时间,降低初学者的学习成本;同时,使用dtplyr来提高运行的性能,让代码运行得更快。这样,代码就达到了又快又美的效果。dtplyr的官网链接可参考:

Data Table Back-End for dplyr​dtplyr.tidyverse.org

关于数据的简介,以及需求,大家可以先去看原帖子:R练习50题 - 第一期

下面给出我的代码:

library(pacman)

p_load(tidyverse,dtplyr,data.table)

read_rds(".") -> data  #  .为数据所在路径

# 1.哪些股票的代码中包含"8"这个数字?

## data.table 
data[str_detect(symbol, "8"), 
     unique(symbol)]

## dtplyr 
data %>% 
  lazy_dt() %>% 
  filter(str_detect(symbol,"8")) %>% 
  distinct(symbol) %>% 
  as_tibble()

# 2.每天上涨和下跌的股票各有多少?

## data.table
data[, 
     .(num = uniqueN(symbol)), 
     keyby = .(date, updown = ifelse(close - pre_close > 0, "UP", "DOWN"))]

## dtplyr 
data %>% 
  lazy_dt() %>% 
  mutate(updown = ifelse(close - pre_close > 0, "UP", "DOWN")) %>% 
  count(date,updown) %>%
  as_tibble()

dtplyr的语法规则就是,大家直接写dplyr,但是在数据后面补一个lazy_dt()。

同时,在最后写一个as_tibble()即可(as.data.table或as.data.frame也可以)。

dtplyr的核心功能就是把最常用的dplyr代码“翻译”成data.table的代码。事实上,不是所有的dplyr代码都能够转为data.table的,但是常用的相通部分都可以实现。其实,甚至感觉dtplyr是在取data.table的精华而去其糟粕,很多很难记的而较少用的data.table代码是无法用dtplyr来翻译的,而能够翻译的往往是最核心有用的部分,比如分组、汇总、筛选、计数等。希望在不久的将来,可以直接不写lazy_dt()直接在dplyr中实现高效操作,这应该是趋势。同时,希望dplyr能够在可读性的路上越走越远、越走越高;希望data.table在高性能的路上登峰造极。做个比喻,dplyr和data.table就像木叶忍村一明一暗,一阴一阳,推动R语言数据操作的不断进步。总有一天两者会合二为一,这一点是可以坚信的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值