R---数据以及数据的结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R---数据以及数据的结构相关的知识,希望对你有一定的参考价值。

参考技术A

在R中,常见的数据类型一共有5种:
字符型character,
数值型numeric,
整形integer,
复数型complex,
逻辑型logical

还需要注意的是,如果我们直接输入1,2,3,4...得到的是numeric类型。如果想要输入integer类型,需要输入1L,2L,3L,4L...

Inf表示无穷大,-Inf表示无穷小。
同理1/0表示无穷大,-1/0表示无穷小
如果输入0/0则会得到Nan这样的显示,Nan表示在计算的时候出现错误。
而如果出现Na则表示缺失值。我们可以认为Na包含了NaN。

在R语言中,常见的数据的结构有以下几种:
向量,列表,矩阵,数组,数据框,因子

特点:相同类型,序列
如何创建向量?
1、创建初始向量:vector(‘数据类型’,数据个数),例如,我们输入:x<-vector(\'numeric\',10),可以得到如下结果,可以看到x的类型为数值型numeric。

2、用vector其实等同于直接用数据类型后面跟数据个数,上面的例子其实就可以写成numeric(10),运行之后可以得到相同的结果:

3、如果需要创建的向量是等差为1的等差数列,如1到20的数列,我们可以直接写成:
1:20

4、更多情况下,我们用c()函数用来创建向量,把数据对象连结在一起(concatenate)
例如:
c(1,2)

如上图可见,这里的数据类型class显示的是“numeric”,说明c(1,2)生成的向量里面的数据类型是数值型,而非整形integer。如果想要得到整形的向量,我们需要输入:
c(1L,2L)

如果输入c(TRUE,FALSE,FALSE,TRUE),得到逻辑型向量

如果输入c(\'初中\',\'高中\',\'大学\'),得到文本型向量

注意
就像我们之前提到的,向量里面必须得是相同类型的数据。如果在创建向量的时候,输入了不同类型的数据,R会强制将不同类型的数据转换成相同的数据类型。
例如,输入c(1.7,\'a\'),最后生成的结果如图,1.7被转成了字符型,我们也可以从class里面看到类型是字符型character。

输入c(T,2),最后生成的结果如图,T由逻辑型转成了数值型。

输入c("a",T),得到的结果如图所示,T由逻辑型转成了字符型。

上面提到的这几种转换,通常都是R强制地悄悄地执行的。如果我们自己想要转换数据类型,则应该应用:
as.numeric/logical/character/complex(向量名) 来进行转换。

特点:列表和向量相同的地方在于,二者都是序列;不同的地方在于,列表是由不同类型的对象组成的,而向量则由同样类型的数据组成。
写作:list(name1=object1,name2=object2,…)
例如:输入x<-list(1,\'a\',T,b=c(1+4i,2-3i)),我们可以明显看到list()里面的每个部分类型都不同(数值,字符,逻辑值,向量),输出结果如图:

是一类特殊向量,维度属性。
matrix(数据, nrow = 几行, ncol = 几列, byrow = FALSE/T是否按行排列, dimnames = list(c(行名),c(列名 )))
斜体的部分表示可以不写。
例如,我们想要输入1-8,2行,4列,按照行排列,行名为张三、王五,列名为吃喝玩乐。可以得到如下图:
matrix(1:8,2,4,byrow=T,dimnames = list(c(\'张三\',\'王五\'),c(\'吃\',\'喝\',\'玩\',\'乐\')))

矩阵还有另外一种方法可以创建,用cbind() rbind()创建
例如有x,y两个向量。cbind()是按照列来连接xy(x一列,y一列);rbind是按照行连接xy(x一行,y一行)
注意 :如果用rbind()来合并矩阵或者向量或者表格,必须要求二者列名一致

矩阵还有另外一种方法可以创建,创建一个向量,而后添加维度

t()表示矩阵的转置

array,和matrix最大的区别在于array的维度更多,有三个维度。
我们可以理解为matrix有行、列两个维度;但是array多了一个面板维度(分成几块)。
array(数据,dim=c(几行,几列,几块),dimnames = list(c(行名),c(列名),c(板块名)))
例如:
array(1:12,dim=c(2,3,2),dimnames=list(c(\'从前\',\'现在\'),c(\'衣\',\'食\',\'行\'),c(\'北京\',\'上海\')))
得到如下结果:

数据框是R的一个重要数据类型,用来存储表格数据。可认为是特殊类型的列表,列表中每个元素(每类)都有同样的长度。每一列可以是不同的类型(矩阵是相同的)。可以通过调用data.matrix()将数据框转化为矩阵。
数据框很像我们在使用SQL的时候来定义表格之后,给表格中的各列赋值的情况。
data.frame(列1=向量,列2=向量)
例如:data.frame(foo=1:4,bar=c(T,T,F,F))

nrow(x)----x有几行
ncol(x)----x有几列

特点:用于创建分类数据,两种类型:有序/无序。
可以写成这样的形式:
factor(c("第一类","第二类","第三类",...),levels=c("第一类","第二类","第三类"),ordered = T)
ordered默认为F。
例如:factor(c("小学","初中","高中","小学"),levels=c("小学","初中","高中"),ordered = T)
得到如下结果:

我们如果不对level进行定义,出现如下结果:
此时虽然有比较,但是初中<高中<小学,这样的结果是根据字母发音排序的结果,或许并不是我们想要的,所以如果我们对排序有要求,还是要对levels进行定义。levels=c("第一类","第二类","第三类"),理解为
"第一类"<"第二类"<"第三类"

我们如果不对ordered进行定义,出现如下结果:
此时为无序数据,无比较。

我们还有另外一种方法来定义因子:gl
gl(有几类, 循环几次, labels = c("第一类名称", "第二类名称"),ordered=T)

例如:gl(2,4),表示有两个变量(2),每一个循环4次

例如:gl(2, 8, labels = c("女", "男"),ordered=T),表示有两个变量,各循环8次,这两个变量分别表示为“女”和“男”,排序。
注意,这里和上一个例子一样,本来应该是给出两个变量用1和2表示,labels相当于给1和2加了“女”和“男”的标签。所以排序之后显示“女”<“男”,其背后真实的情况是1<2 。

例如: gl(2, 8, labels = c("女", "男"),ordered=T,length=32),在以上的基础上,规定一共有32个对象

通过我们以上的论述,我们知道了5种数据类型和几种常见的对象形态。
这些是R中非常基础但是十分重要的内容,需要多看几遍才能记得更清楚。

数据类型与数据结构

想要用好R语言来进行数据分析和挖掘,首先你得了解R语言的数据类型以及数据结构的构成,本文主要介绍R中的数据类型以及数据结构。

数据类型

R中的数据类型主要包括数值型, 字符型,因子型,逻辑型,缺失数据

数值型numeric

数值型数据是计算中最常用的数据类型,它是包括四则运算、乘方、开方、阶乘、排列组合等在内的运算都会用到的一种数据类型。

> 1

[1] 1

> 1+2

[1] 3

> 2^10

[1] 1024

字符型character

字符型数据存储字符型数据,也可用来作为列名,文本挖掘的数据类型也主要是以字符型数据为主。

> "Paul"

[1] "Paul"

> "Clippers"

[1] "Clippers"

因子型factor

因子型在R中用到的不是很多,它主要用来存储离散的分类数据或者有序

> factor("A")

[1] A

Levels: A

> factor(c("B","A","C"))

[1] B A C

Levels: A B C

> factor(c("B","A","C"),levels = c("A","B","C"),ordered = T)

[1] B A C

Levels: A < B < C

逻辑型logical

逻辑型向量在条件判断语句中发挥着比较重要的作用

> 1>2

[1] FALSE

> 2==2

[1] TRUE

缺失数据missing data

缺失数据类型有三种,NA,NaN和NULL,三种含义不相同,NA指一般意义上的数据缺失,NaN表示数据无意义,NULL表示空集。

数据结构

R中的基本数据结构有五种,向量、矩阵、数组、数据框、列表。五种数据格式都有各自的特点,下面我来逐一进行介绍。

向量vector

向量是一维数据,它所存储的数据类型必须是一致的,否则R会将强制转换将其统一格式。

创建向量

向量的一般创建方式是c(),如score=c(43,81,61,53,61),即创建了一个名为score的数值型向量,它包含五个元素,分别是43,81,61,53,61

a:b 生成a到b的数列,间隔为1

> 1:5

[1] 1 2 3 4 5

seq(from = a, to = b, by = n)生成间隔为1的a到b的数列

> seq(from=1,to=10,by=2)

[1] 1 3 5 7 9

rep(x, times) 生成重复n次x的向量(x本身可以是向量)

> rep(1,5)

[1] 1 1 1 1 1

> rep(1:2,3)

[1] 1 2 1 2 1 2

提取向量元素

提取元素采用[ ]来进行操作

> score[2]   #取单个元素

[1] 81

> score[c(1,2)]  #取多个元素

[1] 43 81

> score[score>60]   #按条件提取

[1] 81 61 61

> score[-4]   #删除元素

[1] 43 81 61 61

> c(score,100)    #添加元素

[1]  43  81  61  53  61 100

> score[4] <- 100    #修改元素

> score

[1]  43  81  61 100  61

提取向量的索引

> which(score>60)    #按条件提取索引

[1] 2 3 5

> which(score==81)

[1] 2

> which.max(score)    #取最大值索引

[1] 2

> which.min(score)     #取最小值索引

[1] 1

> match(81,score)    #匹配提取索引

[1] 2

矩阵matrix

矩阵是一个二维数据集,它所存储的数据类型与向量一样,必须是一致的。

创建矩阵

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)

M <- matrix(data = c(c(183,198,206,211,216),c(43,81,61,53,61)),nrow = 5,ncol=2,byrow=FALSE,dimnames = list(c("Pual","Kobe","James","Duncan","O'Neal"),c("height","score")))

> M

                  height score

Pual          183       43

Kobe        198       81

James     206       61

Duncan   211       53

O'Neal     216       61

提取矩阵元素

> M[1,2]    # 提取单个元素

[1] 43

> M[,2]     # 提取整列数据

  Pual   Kobe  James Duncan O'Neal 

    43     81     61     53     61 

> M[1,]    # 提取整行数据

height  score 

   183     43 

数组array

数组是向量和矩阵的拓展,它可以是一维、二维,也可以是多维的。

创建数组

array(data = NA, dim = length(data), dimnames = NULL)

> A <- array(1:24, c(2,3,4))

> A

, , 1

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

[1,]    1    3    5

[2,]    2    4    6

, , 2

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

[1,]    7    9   11

[2,]    8   10   12

, , 3

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

[1,]   13   15   17

[2,]   14   16   18

, , 4

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

[1,]   19   21   23

[2,]   20   22   24

提取数据元素

> A[1,1,1]

[1] 1

> A[,,4]

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

[1,]   19   21   23

[2,]   20   22   24

> A[,2,4]

[1] 21 22

数据框data.frame

数据框是二维数据集,它和结构化数据库中的表结构类似,它的每一列数据中的数据类型必须相同,但是不同列之间的数据类型可以不一样。它是在数据分析和挖掘中用到的最多的一种数据结构。

创建数据框

data.frame(..., row.names = NULL)

> dat <- data.frame(name=c("Pual","Kobe","James","Duncan","O'Neal"),

+ height=c(183,198,206,211,216),

+ score=c(43,81,61,53,61),

+ team=c("Clippers","Lakers","Cavaliers","Lakers","Spurs"),

+ stringsAsFactors = F)

> dat

    name height score      team

1   Pual    183    43  Clippers

2   Kobe    198    81    Lakers

3  James    206    61 Cavaliers

4 Duncan    211    53    Lakers

5 O'Neal    216    61     Spurs

提取数据框元素

提取列用$加列名或者[["列名"]]

> dat$name

[1] "Pual"   "Kobe"   "James"  "Duncan" "O'Neal"

> dat[["height"]]

[1] 183 198 206 211 216

数据框同矩阵一样是二维的,同样可以采用提取矩阵元素的方式来提取数据框中的元素。

列表list

列表可以同时包含以上一种或者多种数据结构,一般用来存储非结构化的数据。

创建列表

list(...)

> L <- list(name="Pual",height=183,

+           scores=c(43,21,22,23,18))

> L

$name

[1] "Pual"

$height

[1] 183

$scores

[1] 43 21 22 23 18

提取列表元素

> L$scores

[1] 43 21 22 23 18

> L[["name"]]

[1] "Pual"

小结

这几种常用的数据类型、数据结构之间有一定的关系,可以相互转换。向量和矩阵可以看做是数组中的一维和二维的特殊情形,数据框是列表的一种特殊情形,数据框和矩阵在一定条件下可以相互转换。


长按识别图中二维码




以上是关于R---数据以及数据的结构的主要内容,如果未能解决你的问题,请参考以下文章

Mysql(12)—哈希索引的数据结构以及索引的优缺点

R语言数据结构与类型

R语言数据结构二

附代码 |详解R语言的高级数据结构

R语言基础数据类型/数据结构/常用函数

Redis基本数据类型以及String