R 语言摘记(R-intro)

寻求帮助,使用 help(solve),?solve 和 help(“solve”)是一样的,如果需要搜索可以用 help.search(solve) 或者 ??solve。另外使用 help.start() 可以打开网页版的帮助,这个功能倒是和 Matlab 的 doc 有几分相似。

 

使用 source() 和 sink() 命令可以将 R 的输入输出重新定向,比如从一个文件中读入命令就是 source( “my-file.R”),而将输出导入到文件则是 sink( “output.result” )。

 

对于一个 workspace 里面的数据,可以用 objects() 或者 ls() 列出,rm(x, y, z) 删掉某些变量,值得注意的是这里直接写变量名,都没有引号,这是和 R 语言的规范有关系的(与 lisp 挺像的)。结束一个 session 的时候可以将 workspace 的内容存储在工作目录下,作为 .RData 文件,下次在该目录使用 R 打开新的 R 对话时会自动的读入。存储 workspace 可以用 save.image(),或者更加细致的 save() 命令。

 

R 的赋值使用 ->、<- 或者 assign( variable, content ) 形式。主要的数据类形式 vector、objects、factor、array、matrix、list 和 data frame。vector 这个和一般的 Matlab 数组类似,但是和 Matlab 的运算不同的是,它不需要参与运算的两者长度一样,不同长度的元素会按照最长的那一个重复。

 

常用生成 vector 的函数有 seq() 类似 matlab 的 linspace 或者 1:2:10 这种类型的等差数列,rep() 是类似 repmat 的作用,但是可以将整体重复或者将每个元素重复。和 Matlab 类似,R 也拥有 logical vector(支持 !、& 等逻辑操作),vector 里面的 NA 表示 missing value。判断 NA 使用 is.na(),这个与 Matlab 的 is 系列函数类似。注意 is.na(x) 与 x == NA 的结果是不同的。另外有一些计算会产生 NaN,这和 NA 有一定的不同,但是 is.na() 对两者不加区分,而 is.nan() 可以区分两者。

 

R 的字符串 vector 和 matlab 类似,都是用现成的结构(R 使用 vector)存放的,R 支持单引号或者双引号,也支持 C 语言中的转意字符,如 \n、\t 等。

 

如果需要取一个 vector 的一部分出来,与 Matlab 类似可以用 logical vector,或者一个整数 vector,但是和 matlab 不同的是,索引使用 [],而不是 (),另外允许对返回值使用索引,比如 (1:10)[seq(1, 10, by=2)] 是允许的。另外如果 index 出现负数,表示除掉这些绝对值后的 index 剩下的 index。与 Matlab 类似,索引的 vector 可以作为左值。不同的是 R 的 vector 有 names 属性,这意味着每个元素还可以通过字符串来进行索引(需要用 names(myvector)<-c(…) 赋值)。

 

R 里面的原子结构(atomic structure)是 logical、numeric、complex、character 和 raw,其他的 objects 都是这些 atom 的组合,我们也把原子的种类称为 mode,比如 vector 是相同的 atom 组成的;而 list 就是为了形成各种结构的嵌套结构,所以每个元素可以是不同的 mode。我们可以用 mode(obj) 获得一个对象的 mode,另外一个属性是 length()。一般来说,我们可以通过 attributes() 获得一个对象的属性。结构的互相转换,常使用 as.*() 函数,如 as.character()、as.integer()。

 

值得注意的是,访问某个对象的属性和修改该属性都使用同一个函数,只是后者加上赋值,如 length(x) <- 3 可以将 x 的长度变成 3,即自动的抛弃其他的元素,一般的使用 attr( objective, “property”) 获得某个对象的属性。每个对象有自己的 class,这可以用 class() 获得,使用 unclass() 可以暂时消除起 class 信息。

 

所谓的 factor 就是所谓的 categorical variable,这分为 ordered 以及 unordered,如创建一个 string vector,通过 factor 构造出一个 unordered factor,我们可以用 levels 获得其标签,如果我们用 class 查看会发现这是 factor,但是用 mode 看却是 numeric。一个 factor 和一个 vector 的组合常被称为 ragged array,因为每个子类的长度不一定相同。我们常用 taaply( vector, factor, fun) 来对每个子类的数据进行计算。ordered factor 使用 ordered() 创建,两者大致看来只是后者会依照 factor 排序,但是在 regression 里面两者是区别对待的。

 

matrix 和 array 都是含有 dim 属性的 vector,因此建立一个 vector,然后对其 dim 属性赋值就变成 matrix 或者 array,matrix 是两维的,更高维的就是 array,如 x<-runif(24),dim(x) <- c(3, 8) 这产生的是 3×8 的 matrix,我们可以通过 class 看见,其 mode 仍然是 numeric。对 array 的索引和 Matlab 一样,可以用 [ , ] 的形式,只是用空参数表示全部的(Matlab 是 :),另外 R 支持用 array 来作索引,如 3×4 的 matrix 可以用 nx2 的 matrix 取其中 n 个元素,每行是一个索引位置。可见 R 里面的 matrix 或者 array 的数据储存并没有改变,只是通过 dim 属性给它添加了额外的索引方式。可以用 array() 和 matrix() 更方便的创建我们需要的矩阵、数组。如我们需要产生一个 N 个样本 c 类的 assignment matrix,A <- matrix(0, N, c); idx <- cbind( 1:N, labels); A[ idx ] <- 1 ; 其中 cbind() 将两个 matrix 依照列拼接,类似的还有 rbind(这分别相当于 Matlab 里面的 [ ; ] 与 [ , ])。当 vector 和 marix/array 混合在一起进行计算的时候,短的 vector 补长,必须拥有相同的 dim。将 matrix/array 转换成为 vector 只需要 as.vector() 或者直接用 c() 即可。

 

常用的矩阵操作有元素对元素的加法、减法和乘法,直接使用 + – * 即可,另外有矩阵乘法用 %*%(vector 作矩阵乘法的时候会产生较小的矩阵,比如两个 vector 相乘,产生的是标量而不是一个矩阵),外积(其实是 Kronecker 乘积)%o% 或者 outer()。不过 outer() 是更广义的函数,除了可以做 %o% 运算,还可以将任意函数作用在类似的结构上。矩阵的转置使用 aperm,这个操作实际上是把 array 的维数互换,因此 aperm( X, c(2 1)) 等价于转置了,更简洁的是使用 t(X)。crossprod(X, y) 等价于 X’y,而diag() 和 Matlab 中函数类似。求解线性系统可以用 solve(A, b),如果写 solve(A) 返回的是 A 的逆。使用 eigen() 可以求出特征值,这返回的的一个是 $value,一个是 $vectors,这种结构将在后面介绍。奇异值使用 svd(),它返回 $d $u $v 三个部分。lsfit() 可以计算最小二乘拟合。qr() 计算对应的 QR 分解。

 

为了统计一些频率,比如 contingency table,都会使用 table() 函数,比如对 factor 的统计,如果是实值的可以用 cut() 函数将其值离散化为 ordered factor,如果有多个 因素,则对应的 contingency table 也是用 table( factor1, factor2 ) 获得的。

 

前面我们看见了 $ 这种写法,这就是 list,这一般使用 list() 创建,list 的元素可以有用来索引的 key,这可以用 listvar$key 获得其内容,也可以使用 listvar[[ "key" ]]获得,通过 [[i]] 这样可以遍历所有 key,注意 [i] 将和 Matlab 对 cell array 使用 (i) 类似,获得的不是第 i 个位置的内容,而是对应位置上的 list。对 list 使用 attributes() 将会返回 names,这是这个 list 所有的 key 组成的 key,如果没有 key,对应的是一个空字符串。这也是 R 默认返回多个返回值的方法。

 

所谓的 data.frame 也是一种 list,但是要求每个子 list 里面都是长度一样的 vector,其实 data.frame 是处理数据最佳的方式,相当于每一列都是一个特征的数据矩阵。通常我们可以用 data.frame() 函数产生,这其实和 list() 函数完全一样。为了处理某个 data.frame 方便,可以用 attach()/detach() 进入到某个 data.frame 的 scope 里,这时就可以免去前面 data$ 的修饰符了,对一般的 list 也可以使用类似的方式。我们要对 R 寻找变量的方式熟悉的话就知道,使用 search() 返回的是搜索变量和函数的 scope,一般 R 的基本函数在 package:base 里面,全局变量在 .GlobalEnv 里面,attach() 的 list 也会添加到这个 vector 里面。最常见读入外部数据的函数是 read.table(),这也是创建 data.frame 的最方便的方式,另外还有一个 scan()。R 自己也带了很多数据供做实验,可以用 data( dataset ) 读入,还可以用某个特定的 package 读入数据。对这种数据一般都可以在一个 spreadsheet 里面编辑,这只需要 edit() 那个 data.frame 就可以了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值