一起学习R软件吧——数组、矩阵、列表、数据框


前言

啥也不多说,学就对了!题外话,其实我是先接触的C语言,之后接触Python和Matlab,现在接触了R语言,其实我最大的感触是学完C语言,不怎么用,之后就几乎忘得差不多了,但是它的逻辑精髓影响着我的其他语言的学习,当然还有一个困扰我的地方是,对于我这号初学者,python,matlab,R语言的一些语法很容易记混,尤其是在写循环和索引的时候,不知道大家是否和我一样有这样的困扰,求大佬指点!


提示:以下是本篇文章正文内容,上面的话仅代表个人观点。

一、多维数组和矩阵

数组(array)可以看成是带多个下标的类型相同元素的集合,常用的是数值型数组如矩阵。R软件可以很容易地生成和处理数组。
数组有一个特殊地属性叫做维数向量,即dim属性。

1.1 构造

将向量定义成数组(向量定义了维数才是数组)。
array()函数构造数组
matrix()函数构造矩阵
注意矩阵的元素是按列存放的 ,构造矩阵时默认值byrow=False,按列排。

> #构建数组
> a=1:8
> dim(a)=c(2,4)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
> dim(a)=8
> a
[1] 1 2 3 4 5 6 7 8  #也可定义为一维数组
> x=array(1:12,dim = c(3,4))
> x
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> #构建矩阵
> #默认值byrow=False,按列排
> A=matrix(1:15,nrow = 3,ncol = 5,byrow = T)
> A
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15

1.2 索引

> a=1:24
> dim(a)=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[2,1,2]
[1] 8
> a[1,2:3,2:3]
     [,1] [,2]
[1,]    9   15
[2,]   11   17
> a[1,,]
     [,1] [,2] [,3] [,4]
[1,]    1    7   13   19
[2,]    3    9   15   21
[3,]    5   11   17   23
> a[,2,]
     [,1] [,2] [,3] [,4]
[1,]    3    9   15   21
[2,]    4   10   16   22
> a[1,1,]
[1]  1  7 13 19
> a[3:10]
[1]  3  4  5  6  7  8  9 10

1.3 运算

数组的运算:数组的加减运算满足矩阵运算的性质,但是数组的乘除运算实际上是对应位置的元素在做运算。

> #运算
> A=matrix(1:6,nrow = 2,byrow = T);A
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> B=matrix(1:6,nrow = 2);B
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> C=matrix(c(1,2,3,4,5,5),nrow = 2);C
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    5
> D=2*C+A/B;D
     [,1]     [,2] [,3]
[1,]    3 6.666667 10.6
[2,]    6 9.250000 11.0
> #矩阵运算
> t(A) #转置
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> M=matrix(1:4,ncol =2);M
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> det(M) #矩阵行列式的值
[1] -2
> x=1:5;y=3*1:5
> x%*%y#内积
     [,1]
[1,]  165
> crossprod(x,y) #内积
     [,1]
[1,]  165
> x%o%y #外积
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    6    9   12   15
[2,]    6   12   18   24   30
[3,]    9   18   27   36   45
[4,]   12   24   36   48   60
[5,]   15   30   45   60   75
> outer(x,y)
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    6    9   12   15
[2,]    6   12   18   24   30
[3,]    9   18   27   36   45
[4,]   12   24   36   48   60
[5,]   15   30   45   60   75
> m=array(1:9,dim = (c(3,3)))
> n=array(9:1,dim = (c(3,3)))
> m*n #代表矩阵对应元素的乘积
     [,1] [,2] [,3]
[1,]    9   24   21
[2,]   16   25   16
[3,]   21   24    9
> m%*%n #代表矩阵的乘积
     [,1] [,2] [,3]
[1,]   90   54   18
[2,]  114   69   24
[3,]  138   84   30
> diag(M) #矩阵对角元素
[1] 1 4
> diag(c(1,2,3)) #创建对角矩阵
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3

关于矩阵的拼接,函数cbind()把自变量按照横向拼成一个矩阵,高度相同。函数rbind()把自变量进行纵向拼接,宽度相同。dimnames()可以进行数组的维命名。aperm()函数可以按照指定新次序重新排列。

> #数组维度命名
> x=matrix(1:4,nrow = 2,
+          dimnames = list(c("A","B"),c("m","n")),
+          byrow = T)
> x
  m n
A 1 2
B 3 4
> aperm(x,c(2,1))
  A B
m 1 3
n 2 4

apply函数可以对数组(矩阵)的一维或者若干维进行某种计算。

> A=matrix(1:6,ncol = 2);A
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> apply(A,1,sum)
[1] 5 7 9
> apply(A,2,mean)
[1] 2 5

二、列表与数据框

2.1 列表构造

列表是一个特别的对象集合,其元素也由下标区分,但是其不同元素不必是同一类型。

2.2 列表索引

注意列表不同意向量,列表每次只能引用一个元素。列表元素可以采用“列表名[[下标]]”(两重括号)或者”列表吗$元素名“来进行引用。
值得注意的是一重括号也是合法的,但是结果类型是列表

示例如下:

> #列表构造
> ky=list(name="ky",age="2",num=c(1,2,1))
> ky
$name
[1] "ky"

$age
[1] "2"

$num
[1] 1 2 1

> ky[["name"]]
[1] "ky"
> ky$age
[1] "2"

突然发现原来代码可以直接插入r的代码块,张见识了。

2.3 数据框生成

数据框(data.frame)是R语言中的一种数据结构,是一种特殊的列表类型。数据框的每列是一个变量,每行是一个观测。作为数据框变量的向量、因子或矩阵必须有相同的长度(行数)常常把数据框看作一个推广的矩阵。

2.4 数据框索引

数据框的元素索引与矩阵类似,可以采用下标或者下标向量,也可以直接使用名字或名字向量。当然数据框额度属性也可以按列表引用(采用双括号[[ ]],或者$来引用)
代码如下(示例):

> #数据框
> df=data.frame(
+   name=c("a","b","c"),
+   age=c(1,2,3),
+   wel=c(4,5,6)
+ )
> #索引
> df[2:3,1:2]
  name age
2    b   2
3    c   3
> df$age
[1] 1 2 3

下边记录一个attach()函数,这个是干啥用的嘞?就是一句话让你省事儿的,不用你老一直“数据框名$变量名“的输入,它可以直接把数据框中的变量”链接“到内存中,这样就可以直接调用数据框中的变量啦。

> attach(df)
> r=age*2
> r
[1] 2 4 6

如果你不想”链接“了,调用一下detach()就ok,无参数即可。

总结

每次一到考试前的学习时间,嘿嘿嘿就有好多事情蹦出来,谨言慎行,很多事情很残酷,但是你却不得不去直面,成长的道路很充满荆棘,在此感谢那些逼着我直面现实的人,让我不断打破自己为自己编织的安乐窝。生于忧患,死于安乐。继续学习,不断努力!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值