R中的对象(中)

我们对R中的数据类型对象有了一定的了解,接下来就是对数据对象的简单操作。在excel里我们可以通过鼠标来实现,在R里我们通过输入代码来实现。

在处理数据量较大的数据时,用R是很方便的,不用做大量的重复性工作。


1运算符

在介绍对数据元素的操作之前我们先来认识一下运算符,这个从幼儿园就开始接触到的东西显得格外亲切。

R中主要有三种运算符:数学运算符、比较运算符和逻辑运算符。


需要注意的是像0<x<1这种类型的不等式需要使用逻辑运算符“逻辑与”,改写成0<x & x<1。


>x<-0.5

> 0<x<1

Error: unexpected '<' in "0

> 0<x & x<1

[1] TRUE


为了整体比较两个对象,可以使用两个函数identical和all.equal


> x<-1:3; y<-1:3

> x==y

[1] TRUE TRUE TRUE

> identical(x,y)

[1] TRUE

> all.equal(x,y)

[1] TRUE


这里需要注意的是,在R里,“=”意思是赋值,作用相当于<-,并不是我们数学上学到的=


> x<-2

> x

[1] 2

> x=3

> x

[1] 3


identical比较数据的内在关系,如果对象是严格相同的返回TRUE。all.equal用来判断两个对象是否近似相等。如果近似相等返回结果TRUE或者对二者差异的描述。all.equal在比较数值变量时考虑到了计算过程中的近似。


> 0.9==(1-0.1)

[1] TRUE

> identical(0.9,1-0.1)

[1] TRUE

> all.equal(0.9,1-0.1)

[1] TRUE

> 0.9==(1.1-0.2)

[1] FALSE

> identical(0.9,1.1-0.2)

[1] FALSE

> all.equal(0.9,1.1-0.2)

[1] TRUE

> all.equal(0.9,1.1-0.1)

[1] "Mean relative difference: 0.1111111"


2访问一个对象的数值-下标系统

下标系统可以用来选择性地获取和改变一个对象中的元素

以最简单的向量为例:


> x<-1:5

> x[2]

[1] 2

> x[2]<-20

> x

[1]  1 20  3  4  5


下标本身也可以是一个数值型的向量;


> i<-c(1,3)

> x[i]

[1] 1 3


获取元素有很多种操作:


> a<-c(1,2,3,4,5,6)

> #查看向量a中的第3个数据

> a[3]

[1] 3

> #查看向量a中的第1、3、5个数据

> a[c(1,3,5)]

[1] 1 3 5

> #查看向量a中的第2到6个数据

> a[2:6]

[1] 2 3 4 5 6

> #查看向量a中大于3的数据

> a[a>3]

[1] 4 5 6

> #去掉第一个数据

> a[-1]

[1] 2 3 4 5 6

> #去掉前3个数据

> a[-1:-3]

[1] 4 5 6


如果我们要获取和改变矩阵中的数据元素,是这样的:


> #创建矩阵x

> x<-matrix(1:6,2,3)

> #查看矩阵x第2行第2列的数据

> x[2,2]

[1] 4

> #查看矩阵x第2行所有的数据

> x[2,]

[1] 2 4 6

> #查看矩阵x第 2列所有的数据

> x[,2]

[1] 3 4

> #查看矩阵x第 2行,第2、3列的数据

> x[2,c(2,3)]

[1] 4 6


如果对象是数据框,操作是这样的:


> patientID<-c(1,2,3,4)

> age<-c(25,35,45,56)

> diabetes <- c("Type1", "Type2", "Type1", "Type1")

> status <- c("Poor", "Improved", "Excellent", "Poor")

#创建数据框patientdata

> patientdata <- data.frame(patientID, age, diabetes, status)

#显示数据框patientdata

> patientdata

  patientID age diabetes    status

1         1  25    Type1      Poor

2         2  35    Type2  Improved

3         3  45    Type1 Excellent

4         4  56    Type1      Poor

#查看数据框 patientdata1到3列向量的数据信息

> patientdata[1:3]

  patientID age diabetes

1         1  25    Type1

2         2  35    Type2

3         3  45    Type1

4         4  56    Type1


#查看数据框 patientdata中名字为age列向量的数据信息

> patientdata$age

[1] 25 35 45 56


我们可以看到在查看矩阵和数据框某一列向量的数据元素时,得到的结果是向量而不是矩阵或数据框。这是因为R的默认规则返回一个维数尽可能低的对象。我们可以通过修改选项drop的默认值来改变:


> x<-matrix(1:6,2,3)

> x

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6

> x[,3,drop=F]

     [,1]

[1,]    5

[2,]    6


查看list的数据信息跟之前有一些不一样的地方:


> mylist

$title

[1] "My First List"


$ages

[1] 25 26 18 39


[[3]]

     [,1] [,2]

[1,]    1    6

[2,]    2    7

[3,]    3    8

[4,]    4    9

[5,]    5   10


[[4]]

[1] "one"   "two"   "three"

#查看列表mylist的第一个对象

> mylist[[1]]

[1] "My First List"

#查看列表mylist中名字为title的对象

> mylist$title

[1] "My First List"

#查看第3个对象的第2列第2、4行的元素

> mylist[[3]][c(2,4),2]

[1] 7 9


3访问对象的名字

names是一个对象元素的字符型标签,就像我们每个人的名字一样。

names是一个和对象有同样长度的向量,可以通过函数names来访问


> mylist[[3]][c(2,4),2]

[1] 7 9

> x<-1:3

> names(x)

NULL

> names(x)<-c("a","b","c")

> names(x)

[1] "a" "b" "c"

> x

a b c

1 2 3

> names(x)<-NULL

> x

[1] 1 2 3


对于矩阵和数据框,colname和rowname分别是行和列的标签。


> x<-matrix(1:4,2)

> rownames(x)<-c("A","B")

> colnames(x)<-c("C","D")

> x

  C D

A 1 3

B 2 4


> dimnames(x)

[[1]]

[1] "A" "B"


[[2]]

[1] "C" "D"


对于数组(array)也可以用dimnames来访问各维的名字

在讲数据类型的时候我们没有说到数组,个人感觉数组就是加了Z轴(三维的)矩阵。


> A<-array(1:8,dim=c(2,2,2))

> A

, , 1


     [,1] [,2]

[1,]    1    3

[2,]    2    4


, , 2


     [,1] [,2]

[1,]    5    7

[2,]    6    8


> dimnames(A)<-list(c("A","B"),c("C","D"),c("E","F"))

> A

, , E


  C D

A 1 3

B 2 4


, , F


  C D

A 5 7

B 6 8


4 数据编辑器

我们亦可以打开一个类似Excel表格的图像编辑器去编辑数据对象。


> x<-matrix(1:10,2,5)

> x

     [,1] [,2] [,3] [,4] [,5]

[1,]    1    3    5    7    9

[2,]    2    4    6    8   10

#弹出编辑器的命令

> data.entry(x)

or

> fix(x)


5简单运算

在R中有很多用来处理数据的函数,最简单的就是c,用来连接在()里的对象。


> c(1:5,seq(10,11,0.2))

[1]  1.0  2.0  3.0  4.0  5.0 10.0 10.2 10.4 10.6 10.8 11.0


向量也可以进行简单的算术运算


> x<-1:4

>  y<-rep(1,4)

> x

[1] 1 2 3 4

> y

[1] 1 1 1 1

> z<-x+y

> z

[1] 2 3 4 5


上面展示了相同长度的向量相加,不同长度的向量也可以相加。最短的向量将被循环使用。


> x<-1:4

> y<-1:2

> z<-x

> z

[1] 2 4 4 6

> y<-1:3

> x<-1:4

> z<-x+y

Warning message:

In x + y : longer object length is not a multiple of shorter object length

> z

[1] 2 4 6 5


这不是一个错误报警,而是警告报警,因为y没有完全循环。


如果想对一个向量中所有的元素乘以相同的数,


> x<-1:4

> y=10

> z=x*y

> z

[1] 10 20 30 40


在R中有很多基本的数学函数可以调用:


#求数值向量x的绝对值

> x<-1:10

#求向量x数据的绝对值

> abs(x)

[1]  1  2  3  4  5  6  7  8  9 10

#求向量x数据的平方根

> sqrt(x)

[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278

#求向量x数据的不小于它的最小整数

> ceiling(x)

[1]  1  2  3  4  5  6  7  8  9 10

#求向量x数据的不大于它的最大整数

> floor(x)

[1]  1  2  3  4  5  6  7  8  9 10

##求向量x数据的均值

> mean(x)

[1] 5.5

#求向量x数据的中值

> median(x)

[1] 5.5

#求向量x数据的标准差

> sd(x)

[1] 3.02765

#求向量x数据的方差

> var(x)

[1] 9.166667

#显示向量x数据的范围

> range(x)

[1]  1 10

#求向量x数据的和

> sum(x)

[1] 55

#显示向量x数据的最小值和最大值

> min(x)

[1] 1

> max(x)

[1] 10

#10以5为底的对数

> log(10,base=5)

[1] 1.430677

#10的自然对数

> log(10)

[1] 2.302585

#指数函数

> exp(2.3026)

[1] 10.00015

#常用对数

> log10(10)

[1] 1

#2.35取整

> trunc(2.35)

[1] 2


除了对向量数据进行简单的运算,我们也可以在数据框中调用一些基本的数学函数进行运算。


#创建数据框mydata

>mydata<-data.frame(x1=c(2,2,4,6),x2=c(3,4,2,8))

#增加列向量:数据的总和和平均值

> mydata$sum<-mydata$x1+mydata$x2

>mydata$mean<-( mydata$x1+mydata$x2)/2

> mydata

  x1 x2 sum mean

1  2 3   5  2.5

2  2 4   6  3.0

3  4 2   6  3.0

4  6 8  14  7.0


或者这样


> mydata<-data.frame(x1=c(2,2,4,6),x2=c(3,4,2,8))

> mydata<-transform(mydata,sum=x1+x2,mean=(x1+x2)/2)

> mydata

  x1 x2 sum mean

1  2  3   5  2.5

2  2  4   6  3.0

3  4  2   6  3.0

4  6  8  14  7.0


#删除列变量mean

> mydata$mean<-NULL

> mydata

  x1 x2 sum

1  2  3   5

2  2  4   6

3  4  2   6

4  6  8  14


6缺失值的检测

我们在用excel的时候也知道,在进行数值运算时,缺失值(NA, Not Available)并不等于0。除了缺失值,还有NAN(Not a Number,非数值)。

在处理数据前我们一般要检测缺失值是否存在

> x <-  c(1:3, 5,7, NA, 9)

> is.na(x)

[1] FALSE FALSE  FALSE FALSE FALSE  TRUE FALSE

> sum(x)

[1] NA

> sum( x,  na.rm = T )

[1] 27


7数据类型之间的转化

数据类型之间是可以进行相互转化的

转化之前我们先要明确当前的数据类型,通过下面的命令进行判断:


> is.numeric(x)

[1] TRUE

> is.character(x)

[1] FALSE

> is.logical(x)

[1] FALSE

> is.vector(x)

[1] TRUE

> is.data.frame(x)

[1] FALSE

> is.factor(x)

[1] FALSE

> is.matrix(x)

[1] FALSE


在这里X是一个数值型的向量,我们可以把它转换成字符型向量y:


> y<-as.character(x)

> y

[1] "1" "2" "3" "5" "7" NA  "9"


8排序功能


我们有的时候也会用到排序的功能,比如根据某一列向量数据的数值大小排序


> df <- data.frame (id = 1:4,

+                   weight = c(20, 27, 24, 22),

+                   size = c("small", "large", "medium", "large"))

> order(df$weight)

[1] 1 4 3 2

> df[order(df$weight),]

  id weight   size

1  1     20  small

4  4     22  large

3  3     24 medium

2  2     27  large

#根据列向量weight的数据将weight、size两个列向量从大到小排列

> df[order(df$size,-df$weight),]

  id weight   size

2  2     27  large

4  4     22  large

3  3     24 medium

1  1     20  small

#根据列向量weight的数据将weight、size两个列向量从小到大排列(默认)

> df[order(df$size,df$weight),]

  id weight   size

4  4     22  large

2  2     27  large

3  3     24 medium

1  1     20  small

注意,默认情况下使用order的功能,第一列的数据会自动排序,但后面几列的数据不会。

除此之外,我们还可以使用plyr包中的arrange函数


> library(plyr)

> arrange(df,weight)

  id weight   size

1  1     20  small

2  4     22  large

3  3     24 medium

4  2     27  large

> arrange(df,size,weight)

  id weight   size

1  4     22  large

2  2     27  large

3  3     24 medium

4  1     20  small

> arrange(df,size,-weight)

  id weight   size

1  2     27  large

2  4     22  large

3  3     24 medium

4  1     20  small


除了按照数据框中的列向量的数据数值进行排序,我们也可以自己指定。


> A<-1:4

> B<-c("小明","小王","小李","小张")

> mydata<-data.frame(A,B)

> mydata

  A    B

1 1 小明

2 2 小王

3 3 小李

4 4 小张

> gg<-c(2,1,4,3)

> mydata[order(gg),]

  A    B

2 2 小王

1 1 小明

4 4 小张

3 3 小李


这时,所有的列向量都会按给定的排序排列。

参考资料:

R for beginners

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,988评论 0 13
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,342评论 0 2
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 3,874评论 1 10
  • 我们的掌握目标: ●操纵日期和缺失值 ●熟悉数据类型的转换 ●变量的创建和重编码 ●数据集的排序、合并与取并集 ●...
    小白日常笔记阅读 738评论 0 0
  • 目录: Android:Android 0.*Android 1.*Android 2.*Android 3.*A...
    敲代码的令狐葱阅读 3,853评论 0 2