R 常见问题解答
R frequently asked questions
http://www.r-project.org
153 分钟学会R
This document is generated from LATEXsources compiled with xeLATEX
in a Windows platform. The used packages are amsmath, listings, makeidx and so on.
序:
这篇文档内容的来源多样,既有来自于 R 官方文档(包括 R_intro,R_data,R_admin),
也有来自于互联网的 contributed documents;还有若干来自于 Capital Of Statistics 论坛的讨论
问题。
本文档的目的是为具有一定统计(数学)背景的 R 软件初学者提供一个快速认识 R 软件的
平台,如果你无此背景,可能会对其中的若干表达存在疑问。这篇文档重点不在统计方法上,因
此所列问题不可能详尽到统计学的每个
知识点
高中化学知识点免费下载体育概论知识点下载名人传知识点免费下载线性代数知识点汇总下载高中化学知识点免费下载
。
R 是一个很庞大的体系,在 CRAN 的 Task Views 上可以清楚地看到贝叶斯推断、聚类分
析、机器学习、空间统计、稳健统计等方法的介绍。而这些方法又通过相应的 R Packages 扩展,
可以说学习 R 是一件没有尽头的事情。
如果你的英文阅读没问题,那么精读一本关于 R 的原版
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
籍也是一个不错的选择,但这个
开头常常让人很头痛。希望这份 44 页的文档,对你认识、学习 R 是个不错的帮助。
刘思喆 1 2
February 4, 2013
致谢:
abel,cran,rtist,Xie Yihui,zhangv …
1http://www.bjt.name/todo
2sunbjt
gmail.com
A 前言
1. R 是做什么的?
R 是一个有着统计分析功能及强大作图功能的软件系统,是由新西兰奥克兰大学统计学系
的 Ross Ihaka 和 Robert Gentleman 共同创立。由于 R 受 Becker, Chambers & Wilks 创立的 S
和 Sussman 的 Scheme 两种语言的影响,所以 R 看起来 和S 语言非常相似。
2. 在ଚ里可以下载 R 的安装程序?
在 R 的官方网址上,选择网站镜像 http://cran.r-project.org/mirrors.html,比如
UC Berkeley下载软件副本。R 拥有在 Linux,MacOS X,Windows 平台下的各个版本,如果
是 Windows 用户,进入镜像网站,选择 Windows (95 and later) ,进入 base,下载 R-x.x.x-
win32.exe。
3. 为什么 R ਛ做 R?
部分是因为两位 R 的作者 (Robert Gentleman 和 Ross Ihaka) 的姓名,部分是受到了贝尔
实验室 S 语言的影响(称其为 S 语言的方言或 GNU S)。
4. CRAN 是什么意思?
CRAN 是 Comprehensive R Archive Network 的简写,顾名思义:是拥有同一资料,包括
R 的发布版本,包,文档和源代码的网络集合。
5. 我是新手,我如何开始学习 R?
由于 R 的创立者和维护人员大部分都是统计学家,所以如果你有相关统计背景,将是一个
极好的帮助。如果没有相关背景,R 的官方网站拥有大量的英文学习资源可供选择。当然还可以
参考 http://cran.r-project.org/other-docs.html 上的中文翻译文档。
统计之都 BBS 是一个非常不错的学习 R 的中文网站。在论坛上,你可以搜索到大量学习资
料或直接提出问题同大家探讨。
6. 初学者阅读 R 自行安装的 R-intro 就可以了么?
R-intro 确实是官方文档中最基础的,但它不是从 R 软件应用角度讲的,故并不适合于 R
初学者。可以参考 R-intro 中数据类型、结构部分,作为基础学习。
7. 能列Ѯ一些 R 的经典书目么?
正如这份文档序言中所述,《153 分钟学会 R》更注重于快速认识 R 或者为拥有一定统计背
景的初学者提供快速掌握 R 语言提供一个有效途径。更多技术细节或统计知识仍需通过阅读相
应文献来掌握。
中文资料的话,推荐华东师范大学汤银才老师的《R 语言与统计分析》和北京工业大学薛毅
老师《统计建模与 R 软件》。
2
当然还有一些原版资料是必须要读的,例如:
Modern Applied Statistics with S(Venables and Ripley)
The New S Language: A Programming Environment for Data Analysis and Graphics
—(Richard A. Becker,John M. Chambers,Allan R.Wilks)
A Handbook of Statistical Analysis Using R(Brian S. Everitt,Torsten Hothorn)
Data Analysis and Graphics using R(Maindonald and Braun)
Introductory Statistics with R(Dalgaard)
R in a nutshell
8. R 需要编程么?
不!大多数时候不需要,因为 R 有很多函数和包,而且每天都在增加,你用的一般方法和
函数都可以在 R 自带包中找到。
9. 能否简单Ѯ一个 R 的例子?
生成 100 个高斯(正态)分布随机数,并对这 100 个数进行特征描述。
1 x <� rnorm (100 ,mean = 5 , sd = 0 . 1 )
mean(x )
3 sd (x )
summary(x )
当然你还可以使用 demo()函数,比如 R 漂亮的图形演示:
demo( graph i c s )
10. R 需要注册费用么?
不需要!R 是一款在 GNU General Public License (GPL) 下发布的开源软件,只是很少一
部分包不能用于商业用途。不知道为什么有些费时、费力且价格不菲的商业统计软件,居然还在
生存?
11. 为什么 R 不能使用超过 50% 的 CPU?
这是 Windows 下任务管理器的误导,它将多个 CPU 看作是单个 CPU,同时计算使用比
例。而 R 是单线程计算软件,它不能同时使用 2 个以上的 CPU。当你的计算机应用的是双核技
术,你会发现 CPU 应用会定格在 50% 上。
12. 如何在发行出版⢙里引用 R
如果你是 LATEX 用户,可以在 R 中使用命令 citation() 得到可供 BibTEX 使用的内容;或
者是某一个包的引用
1 c i t a t i o n ( package = ’ package ’ )
3
B 基础知识
13. 如何获得帮助?
R 的帮助系统非常强大,可以直接使用 “?topic” 或 help(topic) 来获取 topic 的帮助信息;
也可使用 help.search(”topic”) 来搜索帮助系统。
如果你只知道函数的部分名称,那么可以使用 apropos(”tab”) 来搜索得到载入内存所有包
含 tab 字段的函数。
如果还没有得到需要的资料,还有 R Site Search:http://finzi.psych.upenn.edu/
search.html,等价于在 R 平台上使用 RSiteSearch() 函数。
14. R 可使用的最大内存是多少?
R 经常因为过分消耗内存而受到指责,这主要是因为 R 的设计理念造成。不过还好,我们
使用的数据量通常不是很大,通常都可以处理,而且 R 也逐步地在做优化。如果在特定条件下
需要更大的内存来做运算,提供两种途径来设定(增大)内存:
• 启动 R 进程前,增加 R 启动参数。在 CMD 环境下,运行增加参数的 Rterm:
1 r ��max�mem�s i z e=1Gb
或通过添加 RHOME/bin 至系统环境中,直接在 “运行” 中运行3
1 r gu i ��max�mem�s i z e=1Gb
• 启动 R 进程后,通过 memory.limit 函数增大 R 进程的内存限制。
32 位 R 的工作内存大小的设定值为 32Mb 到 3Gb 间的任意数值,而 64 位则没有任何限制。
但需要提示的是:32 位 Windows 平台可用最大有效内存为 2Gb,也就是说,实际上在 32 位
Windows 上 R 的可用的工作内存区间为 32Mb 至 2Gb。
15. 为什么 help.search() 搜索不能使用?
基于浏览器的搜索引擎要求正确安装完整版 Java,且 Java 和 Javascript 须嵌入浏览器。
16. R 支持中文么?
支持,但不好!在 R 中,大部分包的作者都是以英文为母语的,不会对中文字符考虑太多,
故建议使用全英文环境。
但在绘图时,可能会遇到中文支持问题,这时候需要设置 par 中的 family 参数,比如在
2.14.0 版本以后 R 可以直接使用 cairo 模式,这时就需要使用
1 png ( ’ foo . png ’ , type = ” ca i r o ” , , f ami ly=”SimSun” )
p l o t (1 , type = ’n ’ )
3 t ex t (1 , 1 , ’这是 cairo 模式 ’ )
3同样支持 Rterm
4
dev . o f f ( )
同时支持黑体(SimHei)、楷体(KaiTi_GB2312)、幼圆(YouYuan)、隶书(LiSu),或者更
一般的图形设备(非 cairo),设置 family = ’GB1’,即可。
17. R 支持自动补全(Tab completion)么?
支持!在 2.5.0 版本中,R 引入了命令自动补全功能,使用 Tab 键能自动补全 R 命令;或
使用第二次 Tab 后,返回所有可能的补全命令列表。
18. 如何清除变量?
清除单个变量使用 rm() 函数,清除内存中所有的变量:
rm( l i s t = l s ( a l l = TRUE) )
19. 如何更改小数点后显示数字位数?
options(digits = ) ,digits 后面的参数为 1 至 22 的数字,默认为 7。options 函数还可以改
变很多全局选项,如更改提示符 (prompt) ,是否显示错误信息 (show.error.messages) 等。
20. 如何调用系统内的程序?
使用 system() 函数或用 shell.exec() 调用相应程序来打开文件:
1 # go to the cran
system ( paste ( ’ ”C: /Program F i l e s / In t e rn e t Explorer / i e x p l o r e . exe ” ’ ,
3 ’ cran . r�p ro j e c t . org ’ ) , wait = FALSE)
# invoke the notepad
5 system ( ”notepad ” )
s h e l l . exec ( ”C: /WINDOWS/ c lock ” )
21. Windows 下升级 R ,但不想重装 packages ?
鉴于 R 的更新速度(大概每 3 个月会有一次升级),频繁的更新主程序,可能是我们在
Windows 环境下最常遇到的问题,再加之本地 Contributed Packages 数量很大,这个问题会更
加突出。
一般来说,R 本地的目录结构相对固定,可以通过在其他目录下安装 R ,再将旧版本保留
的 library 目录下的文件拷贝至新版本 library 目录下或卸载 R ,把 R 装到旧的目录下,最后使
用如下命令更新:
update . packages ( checkBui l t = TRUE, ask = FALSE)
2 # or i n s t a l l . packages ( . packages ( a l l = TRUE) )
22. 如何卸载已安装的 packages?
5
参考
remove . packages ( c ( ”pkg1” , ”pkg2” ) ,
2 l i b = f i l e . path ( ”path” , ” to ” , ” l i b r a r y ” ) )
23. R 的工作目录在ଚ里?
一般的,Windows XP 下的 R 工作目录在
C:\ Documents and Se t t i n g s \username
或者使用 getwd() 命令获得 R 的工作目录 (Working Directory),使用 setwd() 设置工作目录位
置。
24. 我ᘾ样保存自己的工作?
使用 save.image() 函数。它将在 R 的起始目录保存记ᗶ区(working space)至.RData 文
件;或者使用 save(..., file = ) 保存需要保存的 R 对象。
25. R 如何安装包?
通过选择下载镜像,R 可以自动安装未安装在本地的包,当然也可以从镜像网站下载可用
的包,直接本地安装 4。
26. library() 的逆向操作是什么?
当加载包后,需要分离 R 同包时,可以使用
1 detach ( ” package : pkg” )
27. Library 和 Package 有什么区别?
这两个概念的确容易混淆,因为 R 中加载 Package 的命令是 Library!Library 是一个目
录,可能包含一个或多个 Package;而 Package 是包含函数、数据、
手册
华为质量管理手册 下载焊接手册下载团建手册下载团建手册下载ld手册下载
的一个集合,属于某个
Library,即(Windows 下)的 “*.zip” 文件。
28. 如何得到加载 Package 的列表?
search() 函数返回当前加载的包的情况,使用
1 . packages ( a l l . a v a i l a b l e = TRUE)
命令获得本地安装的包列表。
当 R 启动后,R 在内存中会自动加载若干 Package:
4R 有 Unix、Mac、Windows 三个版本,注意包也分别对应三个版本
6
R 初始状态载入包列表
包 描述
stats 常用统计函数
graphics 基础绘图函数
grDevices 基础或 grid 图形设备
utils R 工具函数
datasets 基础数据集
methods 用于 R 对象和编程工具的方法和类的定义
base 基础函数
29. 如何使用 R 内置的数据集?
R 在 datasets 包中共提供了 102 个可以使用的数据集,这些数据集都可以通过 data() 函数
加载入内存。
1 dim( data ( ) $ r e s u l t s )
data ( ) $ r e s u l t s [ , 4 ]
30. R 的数据类型有几种?
R(S 语言)没有标量,它通过使用各种类型的向量来存储数据。常用的数据类型(class)
有:
常用数据类型
类型 说明
1 字符(charactor) 它们常常被引号包围
2 数字(numeric) 实数向量
3 整数(integer) 整数向量
4 逻辑(logical) 逻辑向量(TRUE=T、FALSE=F)
5 复数(complex) 复数a
6 列表(list) S 对象的向量
7 因子(factor) 常用于标记样本
a参考第 18 页 “复数计算”
在 R(S)语言中,有一点要牢记:
Everything in S is an object;
Every object is S has a class.
31. data frame 是什么?
data frame(数据框)可以理解是一个松散的数据集。它可以是由不同类型的列(数字、因
子、字符等)组成的类矩阵(matrix-like)。
7
32. 如何得到函数的代码?
通常情况你只需要在 R 平台下写出你需要查看的函数名,回车即可。比如:
d i s t
但有时候这个函数可能是一个泛型函数(Generic Function),上面的方法就需要稍稍改进一下:
先使用 methods() 函数来查看这个类函数的列表,找到具体需要的函数 5 ,写出来,回车 —问
题解决。
1 summary # I t i s a g en e r i c func i t on
methods ( summary) # l i s t o f the S3 methods
3 summary . lm # maybe you want to know the l i n e a r models ’ s summary
如果要究根问底,可以去下载源代码压缩包(*.tar.gz,比如 R-2.5.1.tar.gz)
33. 我想查看一个矩阵的前(后)几行,ᘾ么办?
可以使用 head() 或 tail() 函数。
1 head (CO2)
这两个函数是类函数,它们可以应用于向量、矩阵、数据框、表格或函数。如果只想随机看看对
象中的一些内容,还可以使用 car 包中的 some 函数。
34. 在 R 中公式的符号都是什么意义?
拿常见的 lm,glm 模型来说,y ˜model 是一种特定的
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
,表示以 y 为响应变量,模型为
model。其中 model 中的变量由 + 来连接,或者由: 来表示变量间的 “交互作用”。
除了 + 和 : ,我们使用 � 来表示 0a+ b+ a : b0。(a+ b+ c)^2 表示 (a+ b+ c) � (a+ b+ c),
即主因素 a、b、c 和各个因素的交互作用。� 表示去掉之意。(a + b + c)^2 � a : b 表示
0a+ b+ c+ b : c+ a : c0。
在公式表达中除了变量和因子名外,运算符号也是可以存在的。如 0 log(y) a + log(x)0 是合
法的。
符号. 在 update 函数中有特殊的意义,它表示 “已经存在” 之意。
1 fm <� aov ( Speed ~ Run + Expt )
fm0 <� update ( fm , . ~ . � Run)
在第 H 节中的网格(lattice)绘图,我们还会看到 j 符号,它可以用来标示 “条件变量”。
35. R 里面可以使用、学计数法么?
可以。
5标注星号的函数可以使用 getAnywhere() 函数获得代码
8
1e10 == 10000000000
2 1 .2 e�4 == 0.00012
C 输入输出
36. R 可以读取其他统计软件录入的数据么?
可以,使用 foreign 包,它可以读取 Minitab, S, SAS, SPSS, Stata, Systat, dBase 保存的数
据。或者使用 Hmisc 包中 sas.get, spss.get 函数来获取 SAS 和 SPSS 软件格式数据。
但随着这些商业软件的版本更新,依旧会出现一些文件不能通过 foreign 包读取的情况,建
议在交换数据时尽量使用.csv 这种通用格式。
37. R 可以读 Excel 的数据么?
可以,但不推荐直接读取 Excel 文件,或许只有微软知道 Excel 里面有什么东西。通常有
三种方法读取 Excel:
1. 将 Excel 另存为 csv(Comma Separated Values) 文件,使用 read.csv() 函数读取(推荐);
2. 加载 RODBC 包,使用 odbcConnectExcel() 函数读取 xls 文件,
l i b r a r y (RODBC)
2 z <� odbcConnectExcel ( ” r e x c e l t e s t . x l s ” )
dd <� sq lFetch ( z , ” Sheet1 ” )
4 c l o s e ( z )
详细请参考 R Data Import/Export;
3. xlsReadWrite 包中的 read.xls函数。
38. 可以将 R 中显示的结果输出到文件么?
可以。使用 sink()函数。
data (CO2)
2 s ink ( ”CO2. txt ” )
CO2
4 s ink ( ) # go to your work d i r e c to ry , you w i l l get CO2. txt
39. 如何调用 R 的输出信息?
R 提供了 capture.output() 函数,这个函数可以将 R 的输出信息转化为字符或文件。
glmout <� capture . output ( example ( glm ) )
2 glmout [ 1 : 5 ]
9
当然,如果你想得到漂亮的输出,Go to LATEX!
40. R 可以从内存直接读写数据么?
可以。拷贝需要读取的内容,使用
data <� read . t ab l e ( ” c l i pboa rd ” )
2 wr i t e . t ab l e ( ” c l i pboa rd ” )
这个技巧对于临时性的分析工作非常有益。
41. ᘾ样将因子 (factor) 转换为数字
这个问题时有发生,假设 f 是一个这样的因子对象,我们可以使用
as . numeric ( as . cha rac t e r ( f ) )
2 # or
as . numeric ( l e v e l s ( f ) ) [ as . i n t e g e r ( f ) ]
这个点一定要小心,因为对于顺序型 factor 数据,如果强制转化为数值型,会返回的是 factor
的顺序信息,而非你看到的 character 信息。
42. R 可以使用⭥子表格输入数据么?
可以使用 edit()和 fix()函数。
1 data <� data . frame ( )
ed i t ( x ) ; f i x ( x )
但,这非常 naive!
43. 为什么当我使用 source() 时,不能显示输出结果?
对需要显示输出的对象使用 print() ,或者使用 source(file, echo = TRUE)。如果 R 代码里
面包含 sink() 之类的函数,必须使用 source(file, echo = TRUE) 才能得到正确的输出结果,否
则 sink 的对象将为空。
44. R 可以输出可供 TEX 使用的文本么?
可以,参考 Hmisc 包中的 latex() 函数和 xtable 包中的 xtable()函数。
a <� matrix ( 1 : 6 , nr=1) # r equ i r e ( x tab l e )
2 colnames ( a ) <� paste ( ” c o l ” , 1 : 6 )
x tab l e ( a )
xtable() 函数可以用于产生 HTML 格式的原码,这样 R 生成的表格就可以非常方便、漂亮地插
入到 word、powerpoint 这类文字处理软件。
输出 LATEX 格式的表格还可以 quantreg 包中的 latex.table()函数。
10
45. 找不到文件,但我知道它在ଚ!
在 R 里面使用必须使用双反斜杠或单斜杠表示文件路径,比如:
1 d :\\R�2.4.1\\ l i b r a r y \\ xgobi \\ s c r i p t s \\ xgobi . bat
d : /R�2.4 .1 / l i b r a r y / xgobi / s c r i p t s / xgobi . bat
当然还可以使用 file.choose() 函数打开一个 Windows 标准文件选择对话框,手动选择文件。当
然还有可以使用 choose.dir() 打开 Windows 标准目录选择对话框 ,。
46. R 可以直接从数据库读取数据么?
可以,并且还可以通过 SQL 语句对数据库进行操作。R 对于基于 SQL 语言的关系型数据
库有良好的支持,这些数据库既有商业数据库 Oracle、Microsoft SQL Server、IBM DB2等,也
包含在GNU General Public License (GPL) 下发布的 MySQL 等开源数据库。
RMySQL 6 包中提供了到 MySQL 数据库的接口;RODBC 包提供了更为广泛数据库接口
的解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
— 支持所有标准 ODBC 接口的数据库。通过这种方式,相同的 R 代码可以方便地
应用于不同类型的数据库。
l i b r a r y (RODBC)
2 ch <� odbcConnect ( ” stocksDSN” , uid = ”myuser” ,pwd = ”mypassword” )
s t o ck s <� sqlQuery ( ch , ” s e l e c t * from quotes ” )
4 odbcClose ( ch )
经测试,Windows平台上的Microsoft SQL Server、Access、Oracle、MySQL、PostgreSQL,
和 Linux 平台上的 MySQL、Oracle、PostgreSQL、SQLite 都有良好的应用案例(详细参考 R-
data)。
D 数据处理
47. 如何删掉缺失值?
在 R 中使用 NA(not available)表示缺失值,要注意 R(S)语言中 NA 同样是一个逻辑
值,7
x <� NA
2 x > 3
c l a s s ( x )
故当判断是否相等时不能使用
1 x == NA
6需要包 DBI 的支持
7R 共有三个逻辑值 TRUE、FALSE、NA
11
来判断缺失值。而是使用函数 is.na()来判断是否为缺失值,使用
1 x [ ! i s . na (x ) ]
删除缺失值。
48. 如何将字符串转变为命令ᢗ行?
这里用到 eval()和 parse()函数。首先使用 parse()函数将字符串转化为表达式(expression),
而后使用 eval() 函数对表达式求解。
1 x <� 1 :10
a <� ” p r in t ( x ) ”
3 c l a s s ( a )
eva l ( parse ( t ex t = a ) )
但在字符串转化为 expression 过程中可能会有一些小麻烦,比如下面这种情况:
a <� 3
2 x <� 4
s t r2expr <� f unc t i on (x ){ eva l ( parse ( t ex t = x ) )}
4 s t r2 expr ( ’ a + a* sq r t ( x ) ’ )
但这时候会报错,原因是参数名为 x,且外部的变量名也为 x,而实际上 eval 在对 expression 做
eval 的时候优先找最近的上一层的 x,也就是 “参数 x”,而不是 “数字 x”,所以 sqrt 要报错。
那么上面的代码需要变通一下:
a <� 3
2 x <� 4
s t r2expr <� f unc t i on (y ){ eva l ( parse ( t ex t = y ) )}
4 s t r2 expr ( ’ a + a* sq r t ( x ) ’ )
或者设置函数表达式中的所有变量都是全局变量,即在 eval 能够在 .GlobalEnv中能找到:
s t r2 expr <� f unc t i on (x ){ eva l ( parse ( t ex t = x ) , . GlobalEnv )}
49. 如何向一个向量䘭加元素?
参考 append()函数。
1 x <� 1 :5
( foo <� c (x [ 1 ] , 0 , x [ 2 : 5 ] ) ) # expected r e s u l t
3 append (x , 0 , a f t e r = 1)
50. 如何〫除某行 (列) 数据
可以使用函数 subset(select = ) ;或者使用下标:
12
1 x <� data . frame ( matrix ( 1 : 3 0 , nrow = 5 , byrow = T) )
dim(x )
3 pr in t ( x )
new . x1 <� x[�c ( 1 , 4 ) , ] #row
5 new . x2 <� x[ ,� c [ 2 , 3 ] ] #co l
new . x1 ; new . x2
事实上,关于选取特定条件下的数据框数据,subset 函数同使用下标效果相同:
iS <� i r i s $ Spec i e s == ” s e t o s a ”
2 i r i s [ iS , c ( 1 , 3 ) ]
subset ( i r i s , s e l e c t = c ( Sepal . Length , Peta l . Length ) ,
4 Spec i e s == ” s e t o sa ” )
51. 如何比较两个数据框是否相同?
比较每个元素是否相同,如果每个元素都相同,那么这两个数据框也相同
a1 <� data . frame (num = 1 :8 , l i b = l e t t e r s [ 1 : 8 ] )
2 a2 <� a1
a2 [ [ 3 , 1 ] ] <� 2 �> a2 [ [ 8 , 2 ] ]
4 any ( a1 !=a2 ) # a l l ( a1 == a2 )
any() 函数可以返回是值是否至少有一个为真的逻辑值。而数据框中的元素有不相等的情况,则
a1 !=a2
将返回至少一个 TRUE,那么 any() 函数将判断为 TRUE。同样也可以使用 identical() 函数。
1 i n d e n t i c a l ( a1 , a2 )
如果需要返回两个数据框不相同的位置,可以使用
1 which ( a1 !=a2 , a r r . ind = TRUE)
arr.ind 参量是array indices 之意,返回数据框的行列位置。
52. 我的数据框有相同的行,如何去掉这些行?
参考 unique 函数。unique 函数可以去掉向量、数据框或类似数列的数据中重复的元素。
1 x <� c ( 9 : 2 0 , 1 : 5 , 3 : 7 , 0 : 8 )
( xu <� x [ ! dup l i ca t ed (x ) ] )
3 unique (x ) # i s more e f f i c i e n t
这里 duplicated 函数返回了元素是否重复的逻辑值。
13
53. 如何对数列(array)进行维度变换?
使用函数 aperm
1 x <� array ( 1 : 2 4 , 2 : 4 )
xt <� aperm(x , c ( 2 , 1 , 3 ) )
3 dim(x ) ; dim( xt )
54. 如何删除 list 中的元素?
R 中使用 NULL 表示无效的对象。
1 l s t <� l i s t ( ”a”=l i s t ( ”b”=1,” c ”=2) , ”b”=l i s t ( ”d”=3,” e ”=4))
l s t [ [ ”a” ] ] [ ”b” ] <� NULL # or l s t $a$b <� NULL
3 l s t
55. 如何对矩阵᤹行 (列) 作计算?
使用函数 apply()
1 vec=1:20
mat=matrix ( vec , nco l=4)
3 vec
cumsum( vec )
5 mat
apply (mat , 2 , cumsum)
7 apply (mat , 1 , cumsum)
56. 如何注掉大段的 R 㝊本
如果你使用支持正则表达式的文本编辑器的话,可以考虑用正则表达式 (Regular Expres-
sion) ;或者将大段的代码写入一个 *.R 文件,如果需要注掉的话,在 source(*.R) 前加入 # 即
可;还可以使用
1 i f (FALSE){
something passby
3 }
57. 如何对数据框 (data frame) 的某列作数学变换?
使用 transform() 函数对其操作,具体参考?transform
58. 如何求解两组平行向量的极值?
pmax() 和 pmin() ,如:
14
1 x <� 1 :10 ; y <� rev (x )
pmax(x , y ) ; pmin (x , y )
59. 如何对不规则数组进行统计分析?
参考 tapply() :
n <� 17 ; f a c <� f a c t o r ( rep ( 1 : 3 , l en = n ) , l e v e l s = 1 : 5 )
2 t ab l e ( f a c )
tapply ( 1 : n , fac , sum)
4 tapply ( 1 : n , fac , mean)
## or r ev e r s e a l i s t
6 to <� l i s t ( a = 1 , b = 1 , c = 2 , d = 1)
tapply ( to , u n l i s t ( to ) , names )
tapply() 的常见于方差分析中对各个组别进行 mean、var(sd)的计算。说到概要统计,不得不
说另外一个函数 aggregate(),它将 tapply() 函数对象为向量的限制扩展到了数据框。8
1 attach ( warpbreaks )
tapply ( breaks , l i s t ( wool , t en s i on ) ,mean)
3 aggregate ( breaks , l i s t ( wool , t en s i on ) ,mean)
## from the help
5 aggregate ( s t a t e . x77 ,
l i s t ( Region = s t a t e . reg ion ,
7 Cold = s t a t e . x77 [ , ” Frost ” ] > 130) ,
mean)
60. 判断数据框的列是否为数字?
使用 sapply 函数
sapply ( dataframe , i s . numeric )
sapply 有循环之意,即返回了 dataframe 的每一列的信息,同样还可以显示内存中所有对象
的占用大小:
1 sapply ( l s ( ) , f unc t i on (x ) round ( ob j e c t . s i z e ( get ( x ) ) /1024/ 1024))
61. 一组数中随机抽取数据?
函数 sample()
8当然同样概要统计的表现形式不一样
15
sample(n) 随机组合 1; : : : ; n
sample(x) 随机组合向量 x; length(x) > 1
sample(x, replace = T) 解靴带法
sample(x,n) 非放回的从 x 中抽取 n 项
sample(x,n, replace = T) 放回的从 x 中抽取 n 项
sample(x,n, replace = T ,prob = p) 以概率 p,放回的从 x 中抽取 n 项
1 n <� 1000
x <� sample ( c (�1 ,1) , n , r ep l a c e=T)
3 p lo t (cumsum(x ) , type=” l ” ,
main=”Cumulated sums o f Be rnou l l i v a r i a b l e s ” )
还可以参考第 20 页中关于模拟已知分布的随机数据函数,如:
rnorm (100 , mean=0, sd=1)
62. 如何根据共有的列将两个数据框合并?
我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同。处理的办法
就是使用 merge(x, y ,by.x = ,by.y = ,all = ) 函数。
如果你对 SQL 语言非常熟悉,还可以使用 sqldf 包来进行数据框合并,这个包可以让用户
在 R 环境下使用标准 SQL 语言进行数据的预处理:
1 example (merge )
s q l d f ( ” s e l e c t * from authors a1 , books a2
3 where a1 . surname = a2 . name” , method = ’ charac t e r ’ )
(m1 <� merge ( authors , books , by . x = ”surname” , by . y = ”name” ) )
当然 sqldf 的作用远远不止于此,一般性 SQL 数据操作均可以实现。
63. 如何将数据标准化?
参考 scale 函数。
x <� c ( rnorm (100) , 2*rnorm (30 ) )
2 m <� s c a l e ( x , s c a l e = F) # only c en t e r i ng
n <� s c a l e ( x , c en t e r = F) # only s c a l i n g
64. 为什么 fivenum 和 summary 两个函数返回的结果不同?
因为他们对数据描述机理一致,所以有些教材将二者等同,但他们确实有细微差别。
1 > fivenum ( c (1 , 4 , 6 , 17 , 50 , 51 , 70 , 100 ) )
[ 1 ] 1 . 0 5 .0 33 .5 60 .5 100 .0
16
3 > quant i l e ( c (1 , 4 , 6 , 17 , 50 , 51 , 70 , 100 ) )
0% 25% 50% 75% 100%
5 1 .00 5 .50 33 .50 55 .75 100 .00
我们看下他们的的定义:分位数是指有百分之多少的数据小于的数值9,我们可以看到关于 14 ; 34
分位数位置的定义:
1 +
1
4
(length(x)� 1);1
4
分位数位置
1 +
3
4
(length(x)� 1);3
4
分位数位置
那么数据
1 c (1 , 4 , 6 , 17 , 50 , 51 , 70 , 100 )
的两个四分位数的位置分别为
1 +
7
4
= 2:75; 1 +
21
4
= 6:25
故对应分位数为
4 + (6� 4)� 0:75 = 5:5; 51 + (70� 51)� 0:25 = 55:75
而 fivenum() 函数中 NL(下)和 NU(上)两个数,是两次利用中位数概念:先取中位数将数
据分为上下两部分当然,如果 length(x) 为偶数,那么数据刚好被分为两部分,如果 lenght(x)
为奇数,那么中位数同属上下两部分,然后再取各部分的中位数,即为 NL; NU。
E 数学运算
65. 如何做出ᴢ线积分?
R 语言使用 integrate 函数来得到积分结果,如
1 i n t e g r a t e (dnorm , �1.96 , 1 . 96 )
i n t e g r a t e (dnorm , �In f , I n f )
3 ## a slowly�convergent i n t e g r a l
integrand <� f unc t i on (x ) {1/ ( ( x+1)* sq r t ( x ) )}
5 i n t e g r a t e ( integrand , lower = 0 , upper = In f )
66. 如何得到一个列向量?
矩阵转置可以使用函数 t() ,R 中默认 x 为 “integer” 类型数据,这时可以用 t(t(x)) 得到
列向量:
9summary() 函数,即使用分位数概念
17
1 x <� 1 :10 ; c l a s s ( x )
t ( x ) ; c l a s s ( t ( x ) )
3 t ( t ( x ) ) ; c l a s s ( t ( t ( x ) ) )
行向量、列向量常常会有一个比较容易让人迷糊的地方:
1 x%*%x
计算的是 xTx(计算 xxT 使用 %o% 或 outer() 函数)。crossprod() 函数能避免这种情况:
1 XT. y <� c ros sprod (X, y )
它直接计算 XTY,可以看作前者的另一种表达方式,当然 crossprod() 更为有效 10。由于
outer() 函数的矩阵意义,它常用于三维绘图数据,比如我们计算
10� sin
p
x2 + y2p
x2 + y2
那么对应的 R 函数计算为:
1 f <� f unc t i on (x , y ) { r <� s q r t ( x^2+y^2) ; 10 * s i n ( r ) / r }
z <� outer (x , y , f )
67. R 如何进行复数计算?
参考 complex() 函数的帮助。
x <� 1 + 1 i # x <� complex (1 , 1 )
2 Mod(x ) ; Conj ( x )
68. 如何生成对角矩阵?
对一个向量使用 diag() 函数,得到对角线元素为向量的对角矩阵;对整数 Z 使用此函数得
到 Z 维的单位矩阵。
69. 求矩阵的特征值和特征向量的函数是什么?
参考 eigen 函数。已知 A =
264�1 2 22 �1 �2
2 �2 �1
375 试求 B = (1
2
A�1) + E 的特征值。
A <� matrix ( c (�1 ,2 ,2 ,2 ,�1 ,�2 ,2 ,�2 ,�1) ,3 ,3)
2 m <� s o l v e ( 0 . 5 *A) + diag ( c ( 1 , 1 , 1 ) )
e i gen (m)
这里还使用了函数 solve() ,这个函数用于运算
10当矩阵很大时,会非常明显,
18
1 a%*%x = b
而得到 x,当然也可以用来求矩阵的逆。
70. 如何构造上(下)三角矩阵?
参考函数 lower.tri() 和 upper.tri() 。
1 Rmat <� matrix ( 1 : 1 6 , 4 , 4 )
Rmat [ lower . t r i (Rmat ) ] <� 0
3 Rmat
71. 求立方根如何运算?
xˆ(1/3)。在 R 里面 sqrt() 函数可以计算开平方,故新手容易推测开立方也有函数。事实上
R 里面使用 ˆ 来作幂函数运算。ˆ 不但是运算符号,还可以看作是函数:
1 ”^” (x , 1/ 3)
在 R 中的运算符号包括:
R 中的运算符号
数学运算 +,-,*,/,ˆ,%%,%/% 加、减、乘、除、乘方、余数、整除
逻辑运算 >;<;>=; <=;==; ! = 大于,小于,大于等于,小于等于,等于,不等于
72. 如何求矩阵各行 (列) 的均值?
如果运算量不是很大,当然可以使用 apply() 函数。rowMeans() 和 colMeans() 函数可以更
快地得到你要的结果。
1 m <� 1000 ; n <� 3000
A <� matrix ( 1 :m*n ,m ,n)
3 system . time (B1 <� matrix ( apply (A, 2 , mean ) , m, n , by = TRUE) )
system . time (B2 <� matrix ( colMeans (A) , m, n , by = TRUE) )
或者使用 sqldf 包来处理。
73. 如何计算组合数或得到所有组合?
choose() 用于计算组合数 �nk�,函数 combn() 可以得到所有元素的组合。使用 factorial() 计
算阶乘。希望大家还记得组合公式�:
Cmn =
!n
!m!(n�m)
74. 如何在 R 里面求(偏)导数?
使用函数 D()
19
f 1 <� exp r e s s i on ( s i n (x ) *x )
2 f 2 <� exp r e s s i on (x^2*y + y^2)
D( f , ”x” )
75. 如何模拟高斯(正态)分布数据?
使用 rnorm(n , mean , sd) 来产生 n 个来自于均值为 mean,标准差为 sd 的高斯(正态)
分布的数据。在 R 里面通过分布前增加字母 ‘d’ 表示概率密度函数,‘p’ 表示累积分布函数,‘q’
表示分位数函数,‘r’ 表示产生该分布的随机数。这些分布具体可以参考第 24 页中 “如何做密度
ᴢ线”,或 R-intro 中的 Probability distributions章节,或
1 help . search ( ” d i s t r i b u t i o n ” )
如已知 X ˜ N(3; 1),计算
P (2 6 X 6 5)
利用正态分布的累积分布函数 pnorm
1 pnorm (5 , 3 , 1 ) � pnorm (2 , 3 , 1 )
计算结果为 0.8185946,即图 1 中阴影的面积。
−2 0 2 4 6 8
0.
0
0.
1
0.
2
0.
3
0.
4
D
en
si
ty
P(2
本文档为【153分钟学会R】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。