R导论学习笔记(一):基础

记录读《R导论》和《153分钟学会R》 的学习笔记


如果你是第一次在UNIX 系统使用 R,我们推荐的操作步骤如下:

  1. 创建一个独立的子目录work 来保存你要在这个系统上用 R 分析的数据文件。当你用 R 处理这些数据时,这将是你的工作目录。
1
2
$ mkdir work
$ cd work
  1. 用命令启动 R 程序。

    1
    $ R
  2. 此时,可以键入 R 的命令(见后面的内容)。

  3. 退出 R 程序的命令是

    1
    >q()
1
为了得到任何特定名字的函数的帮助,如solve,可以使用如下命令 > help(solve)
1
在大多数 R 平台中,你可以通过运行下面的命令得到HTML 格式的帮助。 > help.start()
1
命令可以被(;)隔开,或者另起一行。基本命令可以通过大括弧({和}) 放在一起构成一个复合表达式(compound expression)。注释几乎可以放在任何地方。一行中,从井号(#)开始到句子收尾之间的语句就是注释。
1
如果一批命令保存在工作目录work 下一个叫commands.R 的文件中,可以用下面的命令在 R 会话中执行这个文件。 > source("commands.R")
1
2
如何清除变量?清除单个变量使用 rm() 函数,清除内存中所有的变量: 
rm( l i s t = l s ( a l l = TRUE))
1
2
如何得到函数的代码?通常情况你只需要在 R 平台下写出你需要查看的函数名,回车即可。比如:
d i s t
1
但有时候这个函数可能是一个泛型函数(Generic Function),上面的方法就需要稍稍改进一下:先使用 methods() 函数来查看这个类函数的列表,找到具体需要的函数,写出来,回车 ,问题解决。
1
2
3
summary # It i s a generic funciton
methods (summary) # l i s t of the S3 methods
summary . lm # maybe you want to know the l i n e a r models ’ s summary
1
想查看一个矩阵的前(后)几行, 么办?可以使用 head() 或 tail() 函数。
1
2
3
4
5
在 R 中公式的符号都是什么意义?
拿常见的 lm,glm 模型来说,y ˜model 是一种特定的格式,表示以 y 为响应变量,模型为model。其中 model 中的变量由+来连接,或者由: 来表示变量间的 “交互作用”。除了+和 : ,我们使用 ∗来表示′a + b + a : b′。(a + b + c)∧2表示(a + b + c)∗(a + b + c),即主因素 a、b、c 和各个因素的交互作用。−表示去掉之意。(a + b + c)∧2−a : b表示′a + b + c + b : c + a : c′。在公式表达中除了变量和因子名外,运算符号也是可以存在的。如′log(y) a+log(x)′是合法的。符号. 在 update 函数中有特殊的意义,它表示 “已经存在” 之意。

1fm <− aov ( Speed ~ Run + Expt)
fm0 <− update (fm , . ~ . − Run) # .表示之前的旧模型
1
可以将 R 中显示的结果输出到文件么?可以。使用 sink()函数。
1
2
3
怎样将因子 (factor) 转换为数字

as . numeric ( as . character ( f )) #这个点一定要小心,因为对于顺序型 factor 数据,如果强制转化为数值型,会返回的是 factor的顺序信息,而非你看到的 character 信息。
1
2
3
为什么当我使用 source() 时,不能显示输出结果?

对需要显示输出的对象使用 print() ,或者使用 source(file, echo = TRUE)。如果 R 代码里面包含 sink() 之类的函数,必须使用 source(file, echo = TRUE) 才能得到正确的输出结果,否则 sink 的对象将为空
1
2
3
4
在 R 里面使用必须使用双反斜杠或单斜杠表示文件路径,比如:

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
1
2
3
4
如何删掉缺失值?

在 R 中使用 NA(not available)表示缺失值,要注意 R(S)语言中 NA 同样是一个逻辑值。使用函数 is.na()来判断是否为缺失值,删除缺失值。
x [ ! i s . na (x ) ]
1
2
3
如何将字符串转变为命令行?

这里用到 eval() 和 parse() 函数。首先使用 parse() 函数将字符串转化为表达式(expression),而后使用 eval() 函数对表达式求解`
1
如何向一个向量 加元素?参考 append()函数。
1
2
我的数据框有相同的行,如何去掉这些行?
参考 unique 函数。 duplicated 函数返回了元素是否重复的逻辑值。
1
2
3
4
如何对数列(array)进行维度变换?
使用函数 apermx <− array (1:24 , 2:4)
xt <− aperm (x , c (2 ,1 ,3))
dim(x) ; dim( xt )
1
2
3
4
如何删除 list 中的元素?

R 中使用 NULL 表示无效的对象。
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
1
2
3
4
5
6
7
8
9
如何对矩阵 行 (列) 作计算?使用函数 apply()

vec =1:20
mat=matrix ( vec , ncol =4)
vec
cumsum( vec )
mat
apply (mat ,2 ,cumsum)
apply (mat ,1 ,cumsum)
1
2
3
如何注掉大段的 R  程序

i f (FALSE){something passby}
1
一组数中随机抽取数据?参考函数 sample()
1
2
3
如何根据共有的列将两个数据框合并?

我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同。处理的办法就是使用 merge(x, y ,by.x = ,by.y = ,all = ) 函数。
1
2
3
如何求矩阵各行 (列) 的均值?

如果运算量不是很大,当然可以使用 apply() 函数。row Means() 和 col Means() 函数可以更快地得到你要的结果。
1
2
3
如何计算组合数或得到所有排列组合?

choose() 用于计算排列组合数
1
2
3
如何在 R 里面求(偏)导数?

使用函数 D()
1
2
3
如何模拟高斯(正态)分布数据?

使用 rnorm(n , mean , sd) 来产生 n 个来自于均值为 mean,标准差为 sd 的高斯(正态)分布的数据。在 R 里面通过分布前增加字母 ‘d’ 表示概率密度函数,‘p’ 表示累积分布函数,‘q’表示分位数函数,‘r’ 表示产生该分布的随机数
1
2
3
如何在字符串中选取特定位置的字符?

参考 substr()函数。substr ( ” abcdef ” ,2 ,4)
1
2
3
4
这里要区别一下 length,length 函数是返回向量里元素的个数。比如 “你好吗” 是长度为一的向量,但这个元素的字符长度为三,这里就需要使用 nchar 函数:

nchar ( ’你好吗 ’ )[ 1 ]
3length ( ’你好吗 ’ )[ 1 ] 1
1
2
3
如何在同一面出多张图?

修改绘图参数,如 par(mfrow = c(2,2)) 或 par(mfcol = c(2,2));
1
2
3
4
5
6
7
如何在条形图上显示每个 bar 的数值?

如果明白 barplot() 函数其实是由低级绘图命令 rect() 函数构造的,那下面的例子也就不难理解了:

x <− 1:10 ; names (x) <− l e t t e r s [ 1 : 1 0 ]
b <− barplot (x , col = rev ( heat . c o l o r s (10)) )
text (b , x , l a b e l s = x , pos = 3)
1
2
3
4
没有直接计算峰度和偏度的函数?当然自己写一个也费不了太多时间。FBasics 包中提供了可以直接计算偏度和峰度的函数。

skewness ()
kurtosis ()
1
2
3
4
如何得到一个正态总体均值µ的区间估计?很简单,t.test() 函数

x <− rnorm (100)
t . t e s t (x)
1
2
3
如何做聚类分析?

K 均值聚类 (kmeans() ):层次聚类 (hclust() ):
1
2
3
4
5
6
7
如何做主成分分析?
stats 包中的 princomp 函数(特征根求解),以及 prcomp 函数(奇异值分解)

( pc . cr <− princomp ( USArrests , cor = TRUE))
plot ( pc . cr , type = ” l i n e s ” # or ” barplot ”) # or s c r e e p l o
tloadings ( pc . cr )
princomp() 中的参数 cor = TRUE 表示使用样本相关矩阵作主成分分析,反之使用样本协方差矩阵。loadings() 返回因子荷载。screeplot() 绘制碎石图。
1
2
3
如何对样本数据进行正态检验?比较常见的方法:

shapiro.test() ,ks.test()(Kolmogorov-Smirnov 检验) ,jarque.bera.test()
1
2
3
4
5
如何做配对 t 检验?参考 t.test() 中的 paired 参数

require ( s t a t s )
## Student ’ s paired t−t e s t
t . t e s t ( extra ~ group , data = sleep , paired = TRUE)
1
2
3
多项式回归应该使用什么函数?使用 I() ,例如:

lm(y ~ x + I (x^2) + I (x^3))

如何使用方差分析(ANOVA)?
方差分析同线性回归模型很类似,毕竟它们都是线性模型。最简单实现方差分析的函数为aov(),通过规定函数内公式形式来指定方差分析类型:

1
2
3
如何求解没有常数项的线性回归模型?只需在公式中引入 0 即可 :

r e s u l t <− lm( smokes ~ 0 + male + female , data = smokerdata )
1
2
3
4
5
6
7
回归的命令是?参考 MASS 包中的 lm.ridge() 函数。

data ( longley ) # not the same as the S−PLUS dataset
names ( longley ) [ 1 ] <− ”y”
lm . ridge (y ~ . , longley )
plot (lm . ridge (y ~ . , longley ,lambda = seq ( 0 , 0 . 1 , 0 . 0 0 1 ) ) )
s e l e c t (lm . ridge (y ~ . , longley ,lambda = seq ( 0 , 0 . 1 , 0 . 0 0 0 1 ) ) )
1
`如何使用正交多项式回归?在 R 中,使用 poly() 函数:( z <− poly (1:10 , 3))`
1
2
3
4
如何求 Spearman 等级(或 kendall)相关系数?

cor() 函数默认为求出 Person 相关系数,修改其 method 参数即可求得 Kendallτ和Spearman 秩相关系数。
cor ( longley , method = ”spearman” )
1
`如何做 Decision Tree?基于树型方法的模型(Tree-based model)并不被统计学背景的研究者所熟悉,但它在其他领域却时常被广泛应用。下面是 Modern Applied Statistics With S 中的例子,需要加载 rpart包。l i b r a r y ( rpart )set . seed (123)cpus . rp <− rpart ( log10 ( perf ) ~ . , cpus [ , 2 : 8 ] , cp = 1e−3)plot ( cpus . rp , uniform = T)text ( cpus . rp , d i g i t s = 3)`
1
box-cox 变换?MASS 包中的boxcox ()函数。
1
R 有类似于 SPSS 的界面么?有!安装包 Rcmdr ,加载包后,使用命令Commander()
1
`样来计算函数运行使用时间?使用 system.time() 。proc.time() 可以获得 R 进程存在的时间,system.time() 通过调用两次 proc.time() 来计算函数运行的时间。`
-------------Thanks for Reading!-------------