統計建模與R軟件-第二章
2.1 建立一個R文件,在文件中輸入變量 \(x=(1,2,3)^T\), \(y=(4,5,6)^T\),並作以下運算。
(1)計算\(z=2x+y+e\),其中\(e=(1,1,1)^T\);
(2)計算\(x\)與\(y\)的內積;
(3)計算\(x\)與\(y\)的外積。
x <- c(1, 2, 3)
y <- c(4, 5, 6)
e <- c(1, 1, 1)
2 * x + y + e
## [1] 7 10 13
crossprod(x, y) #內積
## [,1]
## [1,] 32
tcrossprod(x, y) #外積
## [,1] [,2] [,3]
## [1,] 4 5 6
## [2,] 8 10 12
## [3,] 12 15 18
2.2 將1,2,....,20構成兩個4×5階的矩陣,其中矩陣\(A\)是按列輸入,矩陣\(B\)是按行輸入,並作如下運算。
(1)\(C=A+B\)
(2)\(D=AB\)
(3)\(E=(e_{ij})_{n×n}\),其中\(e_{ij}=a_{ij}.b_{ij}\)
(4)\(F\)是由\(A\)的前3行和前3列構成的矩陣
(5)\(G\)是由矩陣\(B\)的各列構成的矩陣,但不含\(B\)的第3列。
A <- matrix(1:20, nrow = 4, byrow = FALSE) #按列輸入
B <- matrix(1:20, nrow = 4, byrow = TRUE) #按行輸入
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
## [,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
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
D <- A %*% B
## Error: 非整合參數
D
## function (expr, name)
## .Internal(D(expr, name))
## <bytecode: 0x04cb6d4c>
## <environment: namespace:stats>
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
F <- A[1:3, 1:3]
F
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
G <- B[, -3]
G
## [,1] [,2] [,3] [,4]
## [1,] 1 2 4 5
## [2,] 6 7 9 10
## [3,] 11 12 14 15
## [4,] 16 17 19 20
2.3 構造一個向量\(x\),向量是由5個1,3個2,4個3和2個4 構成,注意用到rep()函數
c(rep(1, 5), rep(2, 3), rep(3, 4), rep(4, 2))
## [1] 1 1 1 1 1 2 2 2 3 3 3 3 4 4
2.4 生成一個5階的\(Hilbert\)矩陣,
\[H=(h_{ij})_{n×n}, h_{ij}=\frac{1}{i+j-1},\qquad i,j=1,2,\ldots,n. \]
(1)計算\(Hilbert\)矩陣\(H\)的行列式
(2)求\(H\)的逆矩陣
(3)求\(H\)的特征值和特征向量
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
det(H) #行列式值
## [1] 3.749e-12
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
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 已知有5名學生的數據,如表2.3所示,用數據框的形式讀入數據。
序號 | 姓名 | 性別 | 年齡 | 身高(cm) | 體重(kg) |
---|---|---|---|---|---|
1 | 張三 | 女 | 14 | 156 | 42.0 |
2 | 李四 | 男 | 15 | 165 | 49.0 |
3 | 王五 | 女 | 16 | 157 | 41.0 |
4 | 趙六 | 男 | 14 | 162 | 52.0 |
5 | 丁一 | 女 | 15 | 159 | 45.5 |
df <- data.frame(seq = 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, 52, 45.5))
df
## seq name sex age height weight
## 1 1 張三 女 14 156 42.0
## 2 2 李四 男 15 165 49.0
## 3 3 王五 女 16 157 41.0
## 4 4 趙六 男 14 162 52.0
## 5 5 丁一 女 15 159 45.5
2.6 將例2.5中的數據表2.3的數據寫成一個純文本文件,用函數read.table()讀該文件,然后再用函數write.csv()寫成一個能用excel表能打開的文件,並用excel表打開。
df <- data.frame(seq = 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, 52, 45.5))
write.table(df, "ch2_2_6.txt")
df2 <- read.table("ch2_2_6.txt")
write.csv(df2, "ch2_2_6.csv")
2.7 編寫一個R程序(函數)。輸入一個整\(n\),如果\(n<=0\),則終止運算,並輸出一句話:“要求輸入一個正整數”;否則,如果\(n\)是偶數,則將\(n\)除2,並賦值給\(n\);否則將\(3n+1\)賦給\(n\),不斷循環,直到\(n=1\),才停止運算,並輸出一句話:“運算成功”.這個例子是為了驗證數論中的一個簡單定理。
fcul <- function(n) {
if (n <= 0)
list(msg = "要求輸入一個正整數") else {
repeat {
if (n == 1)
break
if (n%%2 == 0) {
n = n/2
} else {
n = 3 * n + 1
}
}
list(msg = "運算成功")
}
}
fcul(-1)
## $msg
## [1] "要求輸入一個正整數"
fcul(10)
## $msg
## [1] "運算成功"
本文由digging4發表於:http://www.cnblogs.com/digging4/p/5031186.html