Notes of R Programming

2012-05-14 中心编辑

一些关于使用R的注意事项:

  • 不用等号用<-赋值,尽管也可以用=,但不建议这么做
  • 获得帮助的三种途径
    1) help ? 获得方法的文档解释
    2) example 获得方法的样例
    3) help.search ?? 模糊搜索,搜寻自己想要的功能,R会返回相关结果
  • 尽管变量的数据类型无需在使用前声明,但在没有声明变量的存储方式之前,直接通过下标的方式对其赋值是会有错误的。比如x[1]<-1,如果x前面没有出现过,也没有显式声明(如vector(length=2)),则会报错。
  • vector会循环。例如,c(1,2,4) + c(2,3,4,5,6) 其中长度略短的c(1,2,4)会“循环”匹配较长的vector长度,被当做c(1,2,4,1,2)来做该加法,因此结果为3 5 8 6 8。
  • vector的过滤。
    1) 对于x<-c(1,2,3),通过x[-2]可以返回一个新的vector,结果为剔除了位置2数据的x。这实际上就是过滤。而R语言在[]中能做得更多,可以直接写判断表达式,如x[x>=2]返回包涵2、3的vector。
    2) 利用subset方法也可以实现过滤,如subset(x,x>5),但与x[x>5]的区别是,subset会剔除NA,而后者则保留。
  • 用args()方法来查看一个函数的参数
  • x<-1:2与y<-c(1,2)的数据类型(typeof)是不同的,利用冒号创建的是整型,而c方法创建的是浮点型。
  • 创建matrix的方式
    1) y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
    2) y<-matrix(nrow=2,ncol=2); y[1,1]<-1….
    3) m<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T) 通过byrow参数来“行优先”输入
  • 取子矩阵的几种方式
    1) 连续取 z[,2:3]:取z矩阵2、3两列
    2) 跳跃取 z[c(1,3),]:取z矩阵1、3两行
    3) 剔除取 z[-2,]:剔除z矩阵第2行
  • apply()方法可以把自定义的function,应用到matrix中的元素上。如果自定义function返回k个元素的vector,那么apply()的结果将包含k行。
  • 通过cbind()和rbind()合并两个vector(matrix)——实际上,所谓“合并”,只是创建了一个新的matrix
  • 从matrix中提取一行或列,被提取的部分会自动成为vector,而不再是matrix。在进行提取的时候,需要指定drop参数为FALSE来保证最终还是matrix。如r<-z[2,, drop=FALSE]。抑或利用as.matrix()方法将被提取的结果改变为matrix
  • array为matrix提供了额外的维度,使得matrix由二元变为三元。如test<-array(data=c(firstMatrix,secondMatrix),dim=c(rownumber,columnnumber,2))。dim参数决定了合并的matrix数量。而array的合并可以实现更高维度的matrix。
  • list的创建方式
    1) 带tag的方式:j<-list(name=”Joe”,salary=55000,union=T)
    2) 无tag的方式:j<-list(“Joe”,55000,T)
    3) vector的mode参数:z<-vector(mode=”list”),之后可以向z赋值
  • list中元素的访问:
    1) list_name$tag_name
    2) list_name[[tag_name]]
    3) list_name[[index]]
  • list中元素的访问需要双层[[]],如果单层[index]或[tag_name]会访问到tag_name(或者index)与值本身,是个子list,而不仅仅是值;而且,双层[[]]中的只能是单一的tag_name或index,不能是类似[[1:3]]这样访问,而单层可以[1:3],提取出1~3作为子list
  • 不像vector在创建之后就无法增加、删除元素,list中的元素是可以动态增减的
  • list中可以嵌套list
  • data frame的创建:

kids<-c(“Jack”,”Jill”)

ages<-c(12,10)

d<-data.frame(kids,ages,stringsAsFactors=FALSE)

  • data frame中元素的创建

1) d[[index]]

2) d$column_name

3) d[,index]:访问第index列

4) d[index,]:访问第index行

5) d[[a:b]]:访问第a列的第b个元素

6) d[a:b]:对data frame提取a列到b列来构成子frame。

  • factor可以根据vector构建而出,比如
    x<-c(5,12,13,12)
    xf<-factor(x)
    当然也可以是字符类型的vector来构建factor
  • factor中有个level的概念,level代表的是分组的结果。通过levels()方法可以列出factor的所有level
  • tapply(x,f,g):vector x按照factor f分组,对每个组运算g方法。其中x与f的长度需要一致。对x的分组f计算,可以不只是一个分组方式,比如对收入x算平均值(g = mean),可以根据年龄段f1来算,也可以根据性别f2来算,于是tapply(x,list(f1,f2),mean)。by()与tapply()类似,但其第一个参数可以是matrix或者data frame。
  • 用split(x,f)方法可以对x进行分组,即taplly的第一步。tapply的第一个参数必须是vector,而split还可接受data frame。
  • <-可用于赋值,但不能用在参数列表中,参数中要用=
  • sort()与order()二者都可以用来做排序,前者直接返回数据集,后者返回index,而被排序的数据集不会被改变,如
    > x
    [1] 13  5  2 15  7
    > sort(x)
    [1]  2  5  7 13 15
    > order(x)
    [1] 3 2 5 1 4
    > x
    [1] 13  5  2 15  7
    > y<-x[order(x)]
    > y
    [1]  2  5  7 13 15
  • rank()方法可以为vector中的元素排名,如
    > rank(c(3,7,2,6,3,9))
    [1] 2.5 5.0 1.0 4.0 2.5 6.0
  • union(x,y):求x与y的并集
  • intersect(x,y):交集
  • setdiff(x,y):补集(包含于x而不包含于y的元素将被返回)
  • setequal(x,y):测试集合是否相等
  • c %in% y:测试c是否属于y集合
  • choose(n,k):长度为n的集合中,长度为k的子集个数

 

文章来源参考http://datawarehou.se/