标题:
R基础课(3)
[打印本页]
作者:
look_w
时间:
2019-2-20 19:18
标题:
R基础课(3)
函数tapply()和不规则数组
为计算样本中每个州的平均收入,我们可以用函数tapply():
incomes <- c(60, 49, 40, 61, 64, 60)incmeans <- tapply(incomes, statef, mean)> incmeansnsw nt qld sa tas 62.5 60.0 40.0 49.0 60.0函数tapply() 可以用来处理一个由多个分类因子决定的向量下标组合。例如,我们可能期望通过州名和性别把这税务会计师分类。
有序因子
因子的水平是以字母顺序排列的,或者显式地在factor中指定。有时候因子的水平有自己的自然顺序并且这种顺序是有意义的。ordered()就是用来创建这种有序因子, ordered()和factor 基本完全一样。
大多数情况下,有序和无序因子的唯一差别在于前者显示的时候反应了各水平的顺序。在线性模型拟合的时候,两种因子对应的对照矩阵的意义是完全不同的。
11). 数组
数组可以看作是带有多个下标类型相同的元素集合。
维度向量(dimension vector)是一个正整数向量。如果它的长度为k,那么该数组就是k-维的。
向量只有在定义了dim属性后才能作为数组在R中使用。
假定,z是一个含1500个元素的向量
z<-seq(1,1500) dim(z) <- c(3,5,100) attributes(z) $dim [1] 3 5 100对dim 属性的赋值使得该向量成一个3 ×5 ×100 的数组
数组索引
数组元素可以通过给定数组名及其后方括号中用逗号隔开的下标访问。可以根据索引数组去给数组中不规则的元素集合赋值或者将数组中特定的元素返回到一个向量中
array()
除了用设定一个向量dim 属性的方法来构建数组,它还可直接通过函数array将向量转换得到.
假定向量h 有24个或更少的数值,那么命令
h<-seq(1,24)Z <- array(h, dim=c(3,4,2))#等价操作dim(Z) <- c(3,4,2)
向量和数组混合运算
表达式运算是从左到右进行的
短的向量操作数将会被循环使用以达到其他操作数的长度
有且只有短的向量和数组在一起,数组必须有一样的属性dim,否则返回一个错误
向量操作数比矩阵或者数组操作数长时会引起错误
如果数组结构给定,同时也没有关于向量的错误信息和强制转换操作,结果将是一个和它的数组操作数属性dim 一致的数组。
数组的外积
数组一个非常重要的运算就是外积运算(outer product)。如果a 和b 是两个数值数组,它们的外积将是这样的一个数组:维度向量通过连接两个操作数的维度向量得到;数据向量则由a的数据向量元素和b的数据向量元素的所有可能乘积得到。外积是通过特别的操作符%o%实现:
ab <- a %o% bab <- outer(a, b, "*") [,1] [,2] [,3][1,] 1 2 3[2,] 2 4 6[3,] 3 6 9命令中的乘法操作符可以被任意一个双变量函数代替。
x<-c(1,2,3);y<-c(2,3,4)f <- function(x, y) cos(y)/(1 + x^2)z <- outer(x, y, f)两个常规向量的外积是一个双下标的数组(就是矩阵,最大秩为1)。
数组的广义转置
函数aperm(a, perm) 可以用来重排一个数组a
B <- aperm(z, c(2,1))#等价操作t(z)
12). 矩阵
矩阵是一个双下标的数组. R包括许多只对矩阵操作的操作符和函数。例如上面提到的t(X)就是矩阵的转置函数。函数nrow(A) 和ncol(A) 将会分别返回矩阵A 的行数和列数。
矩阵相乘
操作符%*% 用于矩阵相乘。
如果A和B是大小一样的方阵,那么
A * B将是一个对应元素乘积的矩阵,而
A %*% B则是一个矩阵积。如果x 是一个向量,那么
x %*% A %*% xcrossprod():可以完成"矢积"运算,也就是说crossprod(X,y) 和t(X) %*% y 等价,而且在运算上更为高效。
diag():返回以该向量元素为对角元素的对角矩阵。
性方程和求逆
求解线性方程组是矩阵乘法的逆运算。当下面的命令运行后,
b <- A %*% x如果仅仅给出A 和b,那么x 就是该线性方程组的根。在R 里面,用命令
solve(A,b)矩阵的逆可以用下面的命令计算,
solve(A)
特征值和特征向量
ev<-eigen(Sm):用来计算矩阵Sm 的特征值和特征向量。这个函数的返回值是一个 含有values 和vectors 两个分量的列表。
ev <- eigen(Sm)ev$values表示Sm 的特征值向量,ev$vec 则是相应特征向量构成的一个矩阵。
奇异值分解和行列式
svd(M): 可以把任意一个矩阵M作为一个参数, 且对M 进行奇异值分解。这包括一个和M 列空间一致的正交列U 的矩阵,一个和M 行空间一致的正交列V 的矩阵,以及一个正元素D 的对角矩阵,如M = U %*% D %*% t(V)。D 实际上以对角元素向量的形式返回。svd(M) 的结果是由d, u 和v构成的一个列表。
如果M 是一个方阵,就不难看出
absdetM <- prod(svd(M)$d)计算M 行列式的绝对值。如果在各种矩阵中都需要这种运算,我们可以把它定义为一个R 函数
absdet <- function(M) prod(svd(M)$d)此后, 我们可以把absdet() 当一个R 函数使用了。R有一个计算行列式的内置函数det和另外一个给出符号和模的函数。
evals <- eigen(Sm, only.values = TRUE)$values
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0