博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
R语言数据结构二
阅读量:6229 次
发布时间:2019-06-21

本文共 6182 字,大约阅读时间需要 20 分钟。

       上节我们讲到R语言中的基本数据类型,包括数值型,复数型,字符型,逻辑型以及对应的操作和不同数值类型之间的转换。众所周知,R语言的优势在于进行数据挖掘,大数据处理等方面,因此单个的数据并不能满足我们的需要,于是向量,矩阵,数组,数据框等变量类型应运而生。

向量:与我们在数学里面所学到的向量不同,R语言中的向量类似于我们在C语言中学习的数组,表示一个同种数据类型的数据集。

向量的创建:在R语言中使用c( )命令就创建了一个向量,任何类型的数据都可以组成向量,但一个向量里面的数据最好类型一致,不然会发生一些变化。向量里面的元素用","分隔。由此可见,当数值型,字符型,逻辑型的数据放在同一个向量时,字符型优先级高于数值型高于逻辑型,逻辑型的TRUE转为数值型的1,逻辑型的FALSE转为数值型的0

> a <- c(1,2,3,4,5)> a[1] 1 2 3 4 5> b <- c("a","b","c","d")> b[1] "a" "b" "c" "d"> c <- c(1,2,"c",4,5)> c[1] "1" "2" "c" "4" "5"> d <- c(1,2,3,TRUE,4,5)> d[1] 1 2 3 1 4 5> e <- c("a",TRUE,"c","d")> e[1] "a"    "TRUE" "c"    "d"

向量的元素个数:与计算字符串字符个数的函数nchar( )以及str_lenth( )不同,函数length( )用来计算向量中元素的个数。

向量的读取:向量在创建过程中,系统就自动给向量里的每个元素都分配了一个索引(1~N,N为向量中元素个数,这与C语言,Python中都不同

读取时用c[ m ]来读取向量c中第m个向量

用c[ m:n ]读取向量c中第m到n个向量

用c[x(m:n)]来表示读取m到n的数乘以x,即c[2*(1:5)]就是读取2*(1,2,3,4,5),也即第2,4,6,8,10五个数

> a <- c(1,2,3,4,5) > length(a)[1] 5> a[3][1] 3> a[2:4][1] 2 3 4
> a[2*(1:5)] #不存在的数用NaN表示[1]  2  4 NA NA NA

向量的计算:数值型的向量计算遵循计算法则,长度不同会警告,同时短的向量会顺次从第一位开始填充到与长的向量相同的长度,开始运算。有关单个数值相关的计算都可以用到向量中,来进行整组相同的运算。

> a <- c(1,2,3,4,5)> b <- c(3,1,4,6,2)> a+b[1]  4  3  7 10  7> a-b[1] -2  1 -1 -2  3> a*b[1]  3  2 12 24 10> a/b[1] 0.333 2.000 0.750 0.667 2.500> a.^2Error: object 'a.' not found> a^2[1]  1  4  9 16 25> log2(a)[1] 0.00 1.00 1.58 2.00 2.32> sqrt(a)[1] 1.00 1.41 1.73 2.00 2.24> a <- c(1,2,3,4,5)> c <- c(2,7,8)> a+c[1]  3  9 11  6 12Warning message:In a + c : longer object length is not a multiple of shorter object length

 其他类型的向量,比如字符型以及逻辑型不能进行上述运算

逻辑型向量与数值型向量还能进行逻辑运算,返回值为布尔型

> a <- c(1,2,3,4,5)> b <- c(3,1,4,6,2)> d <- c("a","b","c")> e <- c("d","e","f")> d+eError in d + e : non-numeric argument to binary operator> a+dError in a + d : non-numeric argument to binary operator> d & eError in d & e :   operations are possible only for numeric, logical or complex types> a & b[1] TRUE TRUE TRUE TRUE TRUE> f <- c(TRUE,TRUE,FALSE,FALSE,TRUE)> a & f[1]  TRUE  TRUE FALSE FALSE  TRUE

 与向量相关的其他函数:最小值min、最大值max、返回最大值与最小值range、谁是最小值which.min、谁是最大值which.max、求和sum、所有向量元素的乘积prod、向量元素排序sort、向量元素平均值mean、样本方差var,数据统计summary

> a <- c(1,2,3,4,5)> min(a)[1] 1> max(x)[1] 0.873> range(a)[1] 1 5> which.min(a)[1] 1> which.max(a)[1] 5> sum(a)[1] 15> prod(a)[1] 120> sort(a)[1] 1 2 3 4 5> sort(a,decreasing = TRUE)[1] 5 4 3 2 1> mean(a)[1] 3> var(a)[1] 2.5> summary(a)   Min. 1st  Qu.  Median    Mean 3rd  Qu.    Max.       1       2    3          3         4       5

 矩阵:矩阵相当于我们在C语言中学习的二位数组,只不过在R语言中对矩阵的处理比在C语言中要方便快速得多                                                                           

矩阵的创建:

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

参数含义如下:

data:矩阵的元素,默认为NA,即未给出元素值的话,各项为NA

nrow:矩阵的行数,默认为1;

ncol:矩阵的列数,默认为1;

byrow:元素是否按行填充,默认按列;

dimnames:以字符型向量表示的行名及列名,dimnames( )可以跟参数,参数需为向量格式,第一个向量为行名,第二个向量为列名

> mydata <- c(1:20)> mydata [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20> myarray <- matrix(mydata,nrow = 4,ncol = 5)> myarray     [,1] [,2] [,3] [,4] [,5][1,]    1    5    9   13   17[2,]    2    6   10   14   18[3,]    3    7   11   15   19[4,]    4    8   12   16   20> cnames <- c("C1","C2","C3","C4","C5")> rnames <- c("R1","R2","R3","R4")> myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames))> myarray   C1 C2 C3 C4 C5R1  1  5  9 13 17R2  2  6 10 14 18R3  3  7 11 15 19R4  4  8 12 16 20> myarray2 <- matrix(mydata,nrow = 4,ncol = 5,byrow = TRUE,dimnames = list(rnames,cnames))> myarray2   C1 C2 C3 C4 C5R1  1  2  3  4  5R2  6  7  8  9 10R3 11 12 13 14 15R4 16 17 18 19 20

 矩阵的拼接:用rbind(用列拼接,拼接后的列数跟两矩阵相同)函数或者cbind(用行拼接,拼接后的行数跟两矩阵相同)函数可以将两个向量或者矩阵合并为一个矩阵。注意需要拼接的两个矩阵对应行和列的数量要相等,并且如果有行名和列名的话,要求对应行行名和列名也必须相同

> mydata <- c(1:20)> mydata [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20> cnames <- c("C1","C2","C3","C4","C5")> rnames <- c("R1","R2","R3","R4")> myarray <- matrix(mydata,nrow = 4,ncol = 5)> myarray     [,1] [,2] [,3] [,4] [,5][1,]    1    5    9   13   17[2,]    2    6   10   14   18[3,]    3    7   11   15   19[4,]    4    8   12   16   20> myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames))> myarray   C1 C2 C3 C4 C5R1  1  5  9 13 17R2  2  6 10 14 18R3  3  7 11 15 19R4  4  8 12 16 20> myarray2 <- matrix(mydata,nrow = 4,ncol = 5,byrow = TRUE,dimnames = list(rnames,cnames))> myarray2   C1 C2 C3 C4 C5R1  1  2  3  4  5R2  6  7  8  9 10R3 11 12 13 14 15R4 16 17 18 19 20> myarray3 <- matrix(c(1:15),nrow=3,ncol=5)> myarray3     [,1] [,2] [,3] [,4] [,5][1,]    1    4    7   10   13[2,]    2    5    8   11   14[3,]    3    6    9   12   15> myarray4 <- matrix(c(1:15),nrow=3,ncol=5,dimnames=list(c("R11","R12","R13"),cnames))> myarray4    C1 C2 C3 C4 C5R11  1  4  7 10 13R12  2  5  8 11 14R13  3  6  9 12 15> cbind(myarray2,myarray4)   #按行进行组合,行数不一致,分别为3和4Error in cbind(myarray2, myarray4) :   number of rows of matrices must match (see arg 2)> rbind(myarray2,myarray4)  #按列进行组合    C1 C2 C3 C4 C5R1   1  2  3  4  5R2   6  7  8  9 10R3  11 12 13 14 15R4  16 17 18 19 20R11  1  4  7 10 13R12  2  5  8 11 14R13  3  6  9 12 15>matrix(c(1:16),nrow=4,ncol=4,dimnames=list(c("R11","R12","R13","R14"),c("C11","C12","C13","C14")))> myarray5    C11 C12 C13 C14R11   1   5   9  13R12   2   6  10  14R13   3   7  11  15R14   4   8  12  16> rbind(myarray2,myarray5)    #按列进行组合,列名不一致Error in rbind(myarray2, myarray5) :   number of columns of matrices must match (see arg 2)

矩阵元素的读取:跟向量读取差不多,多加了一个列的索引而已

常用为c[a,b],意为读取第a行b列的数据

也可以使用c[,b]读取第b列整个列的数据,返回值为向量

> myarray5[2,3][1] 10> myarray5[,3]R11 R12 R13 R14   9  10  11  12

矩阵操作中常用的函数:

+, -, * , /       矩阵的四则运算,对应位置的元素进行运算要求矩阵的维数必须相同
t()                矩阵的行列转置
colSums()    分别对矩阵的每一列进行求和
rowSums()   分别对矩阵的每一行进行求和
colMeans()   分别对矩阵的每一列进行求平均值
rowMeans()  分别对矩阵的每一行进行求平均值
det()             解方程的行列式
crossprod()   解两个矩阵的内积
outer()          解两个矩阵的外积,又叫叉积%*%矩阵乘法,要求第一个矩阵的列数与行数相同
diag()            对矩阵取对角元素,若对象为向量(不管有没有缺失值),则生成以向量为对角元素的对角矩阵
solve()          在矩阵可逆的情况下,对矩阵求逆矩阵
eigen()          对矩阵求解特征值和特征向量

Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的。Data Frame每一列有列名,每一行也可以指定行名。如果不指定行名,那么就是从1开始自增的Sequence来标识每一行。

数据框的创建:使用data.frame( )函数。函数里面的每一个参数包含列索引与对应的值

student<-data.frame(ID=c(11,12,13),Name=c(“Devin”,”Edward”,”Wenli”),Gender=c(“M”,”M”,”F”),Birthdate=c(“1984-12-29″,”1983-5-6”,”1986-8-8”))

另外也可以使用read.table()或者read.csv()读取一个文本文件,返回的也是一个Data Frame对象。

 

转载于:https://www.cnblogs.com/zhaozhibo/p/10335409.html

你可能感兴趣的文章
神经网络和深度学习-第二周神经网络基础-第二节:Logistic回归
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
Io流的概述
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
oracle12C 重做日志
查看>>
zookeeper与kafka安装部署及java环境搭建(发布订阅模式)
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>