第二章 R软件的使用 习题

学号 13 姓名 过纯中

2.2 矩阵运算

将1,2,…,20构成两个4x5价的矩阵,其中矩阵A按列输入,矩阵B按行输入:

A <- matrix(1:20, nrow = 4, ncol = 5)
A
##      [,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
B <- matrix(1:20, nrow = 4, ncol = 5, byrow = TRUE)
B
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    2    3    4    5
## [2,]    6    7    8    9   10
## [3,]   11   12   13   14   15
## [4,]   16   17   18   19   20

1. 矩阵加法

C <- A + B
C
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    2    7   12   17   22
## [2,]    8   13   18   23   28
## [3,]   14   19   24   29   34
## [4,]   20   25   30   35   40

2. 矩阵乘法

D <- A %*% t(B)
D
##      [,1] [,2] [,3] [,4]
## [1,]  175  400  625  850
## [2,]  190  440  690  940
## [3,]  205  480  755 1030
## [4,]  220  520  820 1120

3. 矩阵各元素相乘

E <- A * B
E
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1   10   27   52   85
## [2,]   12   42   80  126  180
## [3,]   33   84  143  210  285
## [4,]   64  136  216  304  400

4. 矩阵前三行和前三列构成子矩阵

F <- A[-4, -(4:5)]
F
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11

5. 矩阵不包括第三列构成新矩阵

G <- cbind(A[, 1], A[, 2], A[, 4], A[, 5])
G
##      [,1] [,2] [,3] [,4]
## [1,]    1    5   13   17
## [2,]    2    6   14   18
## [3,]    3    7   15   19
## [4,]    4    8   16   20

2.3 向量构造

构造一个向量x,向量是由五个1,三个2,四个3,二个4构成,注意用到rep()函数

# Better solution than c(rep(1,5),rep(2,3),rep(3,4),rep(4,2))
x = rep(1:4, c(5, 3, 4, 2))
x
##  [1] 1 1 1 1 1 2 2 2 3 3 3 3 4 4

2.4 Hilbert矩阵

1. 构造5阶hilbert矩阵

n <- 5
h <- array(0, dim = c(n, n))
for (i in 1:n) {
    for (j in 1:n) {
        h[i, j] <- 1/(i + j - 1)
    }
}
h
##        [,1]   [,2]   [,3]   [,4]   [,5]
## [1,] 1.0000 0.5000 0.3333 0.2500 0.2000
## [2,] 0.5000 0.3333 0.2500 0.2000 0.1667
## [3,] 0.3333 0.2500 0.2000 0.1667 0.1429
## [4,] 0.2500 0.2000 0.1667 0.1429 0.1250
## [5,] 0.2000 0.1667 0.1429 0.1250 0.1111
#
# 另一种解法:先自定义Hilbert计算的操作符%!%,然后在向量外积计算中将计算函数重定义为fun=“%!%”
# hilbert =
# function(n){'%!%'=function(x,y){1/(x+y-1)};outer(1:n,1:n,'%!%')} h <-
# hilbert(5)

2. 求行列式

det(h)
## [1] 3.749e-12

3. 求逆矩阵

solve(h)
##       [,1]   [,2]    [,3]    [,4]   [,5]
## [1,]    25   -300    1050   -1400    630
## [2,]  -300   4800  -18900   26880 -12600
## [3,]  1050 -18900   79380 -117600  56700
## [4,] -1400  26880 -117600  179200 -88200
## [5,]   630 -12600   56700  -88200  44100

4. 求特征值和特征向量

eigen(h)
## $values
## [1] 1.567e+00 2.085e-01 1.141e-02 3.059e-04 3.288e-06
## 
## $vectors
##        [,1]    [,2]    [,3]     [,4]      [,5]
## [1,] 0.7679  0.6019 -0.2142  0.04716  0.006174
## [2,] 0.4458 -0.2759  0.7241 -0.43267 -0.116693
## [3,] 0.3216 -0.4249  0.1205  0.66735  0.506164
## [4,] 0.2534 -0.4439 -0.3096  0.23302 -0.767191
## [5,] 0.2098 -0.4290 -0.5652 -0.55760  0.376246

2.5 读入数据到数据框

num = c(1:5)
name = c("张三", "李四", "王五", "赵六", "丁一")
sex = c("女", "男", "女", "男", "女")
age = c(14, 15, 16, 14, 15)
height = c(156, 165, 157, 162, 159)
weight = c(42, 49, 41.5, 52, 45.5)
stu = data.frame(num, name, sex, age, height, weight)
stu
##   num name sex age height weight
## 1   1 张三  女  14    156   42.0
## 2   2 李四  男  15    165   49.0
## 3   3 王五  女  16    157   41.5
## 4   4 赵六  男  14    162   52.0
## 5   5 丁一  女  15    159   45.5

2.6 数据框数据导入导出

1. 写出数据框数据

write.table(stu, "ch2_6_stu.txt")

2. 读入数据框数据

df = read.table("ch2_6_stu.txt", header = TRUE)

3. 数据框数据导出Excel

write.csv(df, "ch2_6_stu.csv")