• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

10个令人相见恨晚的R语言包

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

大约3年前我开始使用R,起初进展很慢,与我习惯的语言相比,语法更加直观也比较简单,而且需要一段时间才能习惯于细微的差别。我还不清楚语言的力量与社区和各种包的密切关系。

和其他语言(比如Python和Java)相比,R可以更模糊和麻烦。好消息是,有大量的包可以在R基础库上提供简单和熟悉的界面。这篇文章是我喜欢和每天使用的10个包,并且我希望自己能早些知道他们。

1. sqldf

R语言学习曲线中最陡峭的一部分就是语法,我花了一段时间才习惯使用<-代替=。我听到很多人问如何实现VLOOKUP?!?R 对于一般的数据粗加工任务非常有用,但需要一段时间才能掌握。可以认为sqldf是我的R”辅助轮子”。

sqldf让你在R数据框上执行SQL查询。来自SAS的人会发现它非常熟悉,任何具有基本SQL技能的人都可以轻松的使用它—sqldf使用SQLite语法。


  1. install.packages("sqldf"
  2. library(sqldf) 
  3.  
  4. sqldf("SELECT 
  5.         day 
  6.         , avg(tempas avg_temp 
  7.       FROM beaver2 
  8.       GROUP BY 
  9.         day;") 
  10.  
  11. #   day avg_temp 
  12. #1 307 37.57931 
  13. #2 308 37.71308 
  14.  
  15. #beavers1 和 beavers2 是R base 自带的两个数据集,记录了两种海狸的体温序列 
  16.  
  17. beavers <- sqldf("select * from beaver1 
  18.                   union all 
  19.                   select * from beaver2;") 
  20. #head(beavers) 
  21. #  day time  temp activ 
  22. #1 346  840 36.33     0 
  23. #2 346  850 36.34     0 
  24. #3 346  900 36.35     0 
  25. #4 346  910 36.42     0 
  26. #5 346  920 36.55     0 
  27. #6 346  930 36.69     0 
  28.  
  29. movies <- data.frame( 
  30.   title=c("The Great Outdoors""Caddyshack""Fletch""Days of Thunder""Crazy Heart"), 
  31.   year=c(1988, 1980, 1985, 1990, 2009) 
  32.   ) 
  33. boxoffice <- data.frame( 
  34.   title=c("The Great Outdoors""Caddyshack""Fletch""Days of Thunder","Top Gun"), 
  35.   revenue=c(43455230, 39846344, 59600000, 157920733, 353816701) 
  36.   ) 
  37.  
  38. sqldf("SELECT 
  39.         m.* 
  40.         , b.revenue 
  41.       FROM 
  42.         movies m 
  43.       INNER JOIN 
  44.         boxoffice b 
  45.           ON m.title = b.title;") 
  46.  
  47. #               title year   revenue 
  48. #1 The Great Outdoors 1988  43455230 
  49. #2         Caddyshack 1980  39846344 
  50. #3             Fletch 1985  59600000 
  51. #4    Days of Thunder 1990 157920733 

如果你喜欢sqldf,可以使用pandasql包来查询pandas中的DataFrame,通过SQL。

2. forecast

我不经常做时间序列分析,但是当我做的时候forecast包是我的选择。forecast对ARIMA,ARMA,AR,指数平滑等时间序列模型的预测简单的令人难以置信。


  1. install.packages("forecast"
  2. library(forecast) 
  3.  
  4. # mdeaths: 英国每月死于肺病的人数 
  5. fit <- auto.arima(mdeaths) 
  6. #定制你的置信区间 
  7. forecast(fit, level=c(80, 95, 99), h=3) 
  8. #         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95    Lo 99    Hi 99 
  9. #Jan 1980       1822.863 1564.192 2081.534 1427.259 2218.467 1302.952 2342.774 
  10. #Feb 1980       1923.190 1635.530 2210.851 1483.251 2363.130 1345.012 2501.368 
  11. #Mar 1980       1789.153 1495.048 2083.258 1339.359 2238.947 1198.023 2380.283 
  12.  
  13. plot(forecast(fit), shadecols="oldstyle"

我最喜欢的特性是产生预测的时序图。

3. plyr

当我第一次使用R时,我用基本的控制运算来操纵数据(for, if, while, etc.)。我很快知道这是一个业余的做法,并且有更好的方法去实现。

在R中,apply函数族是在对列表或者向量每个元素调用函数的首选方法。虽然R基础库中有这些函数,但它们的使用可能难以掌握。我发现plyr包 是一个对R基础库中诸如split,apply, combine的泛函的更好用的替代。

plyr 给予你一些函数 (ddply, daply, dlply, adply, ldply)按照常见的蓝图:将数据结构分组拆分,对每个组应用一个函数,将结果返回到数据结构中。

ddply 拆分一个数据框(data frame)并且返回一个数据框 (所以是 dd)。 daply 拆分一个数据框并且返回一个数组(array) (所以是 da)。希望你明白这个想法。

译者注:plyr包包含了12个命名与功能相关的函数,均以..ply命名,第一个.表示输入的数据类型(a数组 d数据框 l列表),第二个.表示输出的数据类型(_表示不输出)


  1. install.packages("plyr"
  2. library(plyr) 
  3.  
  4. # 按照 Species 拆分数据库,汇总一下,然后转换结果 
  5. # 到数据框 
  6. ddply(iris, .(Species), summarise, 
  7.       mean_petal_length=mean(Petal.Length) 
  8. #     Species mean_petal_length 
  9. #1     setosa             1.462 
  10. #2 versicolor             4.260 
  11. #3  virginica             5.552 
  12.  
  13. # 按照 Species 拆分数据库,汇总一下,然后转换结果 
  14. # 到数组 
  15. unlist(daply(iris[,4:5], .(Species), colwise(mean))) 
  16. #    setosa.Petal.Width versicolor.Petal.Width  virginica.Petal.Width 
  17. #                 0.246                  1.326                  2.026 

4. stringr

我发现R基础库的字符串功能使用起来非常困难和麻烦。Hadley Wickham编写的另一个包, stringr,提供了一些非常需要的字符串运算符。很多函数使用那些做基础分析时不常用的数据结构。

stringr 非常易于使用。几乎所有的(和所有的重要功能)都以”str”为前缀,所以很容易记住。


  1. install.packages("stringr"
  2. library(stringr) 
  3.  
  4. names(iris) 
  5. #[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species" 
  6. names(iris) <- str_replace_all(names(iris), "[.]""_"
  7. names(iris) 
  8. #[1] "Sepal_Length" "Sepal_Width"  "Petal_Length" "Petal_Width"  "Species" 
  9.  
  10. s <- c("Go to Heaven for the climate, Hell for the company."
  11. str_extract_all(s, "[H][a-z]+ "
  12. #[[1]] 
  13. #[1] "Heaven " "Hell " 

5. 数据库驱动的包


  1. install.packages("RPostgreSQL"
  2. install.packages("RMySQL"
  3. install.packages("RMongo"
  4. install.packages("RODBC"
  5. install.packages("RSQLite"

每个人(包括我自己)开始的时候都会这样做。你刚在首选的SQL编辑器中写了一个很棒的查询。一切都是完美的—列名都是snake case(译者注:表示单词之间用下划线连接。单词要么全部大写,要么全部小写。),日期有正确的数据类型,最后调试出了"must appear in the GROUP BY clause or be used in an aggregate function"的问题。你现在准备在R中进行一些分析,因此你可以在SQL编辑器中运行查询,将结果复制到csv(或者……xlsx)并读入R,你并不需要这样做!

R对于几乎每一个可以想到的数据库都有好的驱动。当你在偶尔使用不具有独立驱动程序的数据库(SQL Server)时,你可以随时使用RODBC。


  1. library(RPostgreSQL) 
  2.  
  3. drv <- dbDriver("PostgreSQL"
  4. db <- dbConnect(drv, dbname="ncaa"
  5.                  user="YOUR USER NAME"password="YOUR PASSWORD"
  6.  
  7. q <- "SELECT 
  8.         * 
  9.       FROM 
  10.         game_scores;" 
  11.  
  12. data <- dbGetQuery(db, q) 
  13. head(data) 
  14. #id         school  game_date spread school_score   opponent opp_score was_home 
  15. #1 45111 Boston College 1985-11-16    6.0           21   Syracuse        41    False 
  16. #2 45112 Boston College 1985-11-02   13.5           12 Penn State        16    False 
  17. #3 45113 Boston College 1985-10-26  -11.0           17 Cincinnati        24    False 
  18. #4 45114 Boston College 1985-10-12   -2.0           14       Army        45    False 
  19. #5 45115 Boston College 1985-09-28    5.0           10      Miami        45     True 
  20. #6 45116 Boston College 1985-09-21    6.5           29 Pittsburgh        22    False 
  21. nrow(data) 
  22. #[1] 30932 
  23. ncol(data) 
  24. #[1] 8 

下次你完成了完美的查询后,只需要粘贴到R里面,即可使用 RPostgreSQL, RMySQL,RMongo, SQLite, 或 RODBC执行。不仅可以避免生成数以百计的CSV文件,在R中运行查询还可以节省I/O和转换数据类型的时间。日期,时间等会自动设置为R中的等价表示。它还使你的R脚本可重复,因此你或你团队中的其他人可以轻松获得相同的结果。

6. lubridate

在R中处理日期我从来没有幸运过。我从来没有完全掌握用POSIXs和R内建日期类型合作的方法。请用 lubridate。

lubridate 是那些似乎完全按照你期望的神包之一。这些函数都有易懂的名字如 year,month, ymd, 和 ymd_hms。对于熟悉javascript的人来说,它类似于Moment.js 。


  1. install.packages("lubridate"
  2. library(lubridate) 
  3.  
  4. year("2012-12-12"
  5. #[1] 2012 
  6. day("2012-12-12"
  7. #[1] 12 
  8. ymd("2012-12-12"
  9. #1 按照 %Y-%m-%d 的方式解析 
  10. #[1] "2012-12-12 UTC" 

这是我在一篇文章发现的非常方便的参考卡片。它涵盖了你处理日期时可能想要做的一切事情。 我还发现了这个日期速查表也可以作为一个方便的参考。

7. ggplot2

另一个Hadley Wickham的包,也许是他最知名的一个。 ggplot2在每个人“喜爱的R包”的列表中排名很高。 它很容易使用,并且产生一些很好看的图像。 这是介绍你的工作的好方法,有很多资源可以帮助你开始使用。

  • ggplot2:数据分析与图形艺术 by Hadley Wickham (Amazon)
  • 从Excel到ggplot的罗塞塔石碑 (Yaksis Blog)
  • Hadley Wickham在Google的ggplot2演讲 (youtube)
  • R数据可视化手册 by Winston Chang (Amazon)

8. qcc


  1. install.packages("qcc"
  2. library(qcc) 
  3.  
  4. # 均值为10的序列,

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap