一. 上机(一)_0317_week3
1.1 课堂作业
- 对下列数列
7.3, 6.8, 0.005, 9, 12, 2.4, 18.9, 0.9
(a) 计算数列的均值;
(b) 将均值从数列中减去;
© 找出数列中本身大于其平方根的所有元素;
(d) 将每个元素的平方根近似到小数点后两位 (使用函数 round ).
x1 <- c(7.3,6.8,0.005,9,12,2.4,18.9,0.9)
mean(x1)
print(x2 <- x1 - mean(x1)) #将均值从数列中减去
x3 <- sqrt(x1)
x1 < x3 #找出数列中本身大于其平方根的所有元素
print(x4 <- round(x3,digits = 2)) #将每个元素的平方根近似到小数点后两位
- 计算 2 的前 50 次方和 1 到 50 的平方。这两个序列有那几个元素相等?
分为3步:
(1)计算2的前50次方
(2)计算1到50的平方
(3)判断两个序列有哪几个元素相等
判断这两个序列有那几个元素相等:
(1)
exptwo <- 1:50
for(i in 1:50){
exptwo[i] <- 2 ^ i
print(exptwo[i])
} #计算 2 的前 50 次方
(2)
numsqrt <- 1:50
for(j in 1:50){
numsqrt[j] <- j ^ 2
print(numsqrt[j])
} #计算1 到 50 的平方
(3)判断这两个序列有那几个元素相等:
for(i in 1:50){ #判断这两个序列有那几个元素相等
for(j in 1:50){
if(exptwo[i] == numsqrt[j]){
equal <- exptwo[i]
print(equal)
}
}
}
- 请问 1:9 * 1:4 的结果是什么?你能解释吗?
x5 <- 1:9
x6 <- 1:4
print(x5 * x6)
【注】:
两个不等长的向量之间的运算是长度短的向量将循环使用!(从前到后循环)
所以 1:9 * 1:4 即为:(1,2,3,4,5,6,7,8,9)*(1,2,3,4,1,2,3,4,1)
二. 上机(二)_0324_week4
2.1 课堂作业
y = sin(10 * pi) * exp(-0.3 + 4^2) + log(23) / log(4);y
- x = sin(223/3), y = x^2,z = y*10 ;求x+2y-5z。
x = sin(223 / 3);y = x ^ 2;z = y * 10
print(x + 2 * y - 5 * z)
- 建立起始值=3,增量值=5.5,终止值=44的一维数组x
x <- seq(3,44,by = 5.5);x
有个疑问: 从3开始,步长 5.5 和终止值为44矛盾,无法做到步长为5.5时,终止值为44,只能终止值为41.5 或47 ?(不知道是不是我理解错题目了)
- 建立等差一维数组x:首项为0,末项为,项数为15
x1 <- seq(0,pi,length = 15);x1
- 将100,200,200,200,400,600,600,600,800 输入R中,保存到numeric变量中
numeric <- c(100,200,200,200,400,600,600,600,800)
numeric
- 将numeric转换为factor存入变量factor.numeric,并用class()确认。
factor.numeric <- as.factor(numeric);
factor.numeric;
class(factor.numeric)
- 查看factor.numeric的内容
print(factor.numeric)
- 创建一个2到50的向量,形式为 2, 4, 6, 8, …, 48, 50并名为为vector1
vector1 <- seq(2,50,by = 2)
vector1
- 选取vector1中的第20个元素
vector1[20]
- 选取vector1中的第10,15,20个元素
vector1[10];vector1[15];vector1[20]
- 选取vector1中的第10到20个元素
vector1[10:20]
- 选取vector1中值大于40的元素
vector1[vector1 > 40]
- 使用rep()创建向量1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
y <- rep(1:5,5);y
- 使用rep()创建向量0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4
s <- rep(0:4,each = 5);s
- 用函数rep()构造一个向量x,它由3个3,4个2,5个1构成
x <- rep(1:3,c(5,4,3));x
- 计算行列式的值
A = matrix(c(3,4,7,2,2,8,3,6,1),nrow=3);det(A)
- 矩阵,矩阵;求出A x B及A与B中对应元素之间的乘积
A=matrix(c(3,4,7,2,2,8,3,6,1),nrow=3)
B=matrix(c(1,2,3,1,2,3,1,2,3),nrow=3)
A %*% B #A x B
A * B # A与B中对应元素之间的乘积
- 由1,2,…,16构成两个方阵,其中矩阵A按列输入,矩阵B按行输入,并计C=A+B,D=AB.
A = matrix(1:16,nrow = 4)
B = matrix(1:16,nrow = 4,byrow=TRUE)
C = A + B
C
D = A %*% B
D
2.2 课后作业:黄皮书:P105-106,第2.2和2.4题
T2.2 题目
题目:
#(1)
A = matrix(1:20,nrow = 4)
B = matrix(1:20,nrow = 4,byrow = TRUE)
C <- A + B
C
#(2)
D <- A %*% t(B);D
#(3)
E <- A*B;E
#(4)
F <- A[c(1,2,3),c(1,2,3)];F
#(5)
G <- B[,c(1,2,4,5)];G
T2.4 题目
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)
}
}
print(H)
det(H)
solve(H)
eigen(H)
三.上机(三)_0331_week5
3.1 课堂作业
- 先复制附录数据至文本文档,然后读取数据至文件data
data <- read.table("c:/appendix.txt",header=TRUE);data
- 比值的计算weight和height的平方的比值存入bmi变量
attach(data)
bmi <- weight / sqrt(height)
detach(data)
bmi
- 创建对象x, 其值为1:10, 使用write函数将其写入文件x.txt;删除x, 然后再读入该文件并赋值给x,并保证 x是 numeric.
不知道为什么下面的代码老是报错
x <- 1:10;write.table(x,file = "c:/x.txt")
rm(x)
x <- read.table("c:/x.txt")
x <- as.numeric(x$x)
class(x)
- 查看mtcars数据(mtcars回车);把vs变量所在列的元素全都改成你的“学号后两位”(mtcars$vs<-7);把mtcars存为mtcars.csv文件;读入mtcars.csv文件存入
head(mtcars,5)
mtcars$vs <- 62;mtcars
write.table(mtcars,file = "mtcars.csv")
- 把mtcars转换成矩阵mm并判断数据类型;把第六行改成你的“学号后两位”;取矩阵mm前11行存入变量mtcars11;取mtcars11的主对角线的元素,构成主对角阵mt;取mtcars11的上三角阵存入mtupper;(需要通过网络搜索学习上三角矩阵定义)
下面这段代码待重写,一直报错
mm <- as.matrix(mtcars)
class(mm)
mm[6,] <- 62
mtcars11(mtcars11<-head(mtcars,11))
mt(mt<-diag(diag(mtcars11)))
mtupper(x[lower.tri(x)]<-0;mtupper<-x)
x[lower.tri(x)]<-0
lower.tri(x,diag=FALSE
x[upper.tri(x)]<-0
upper.tri(x,diag=FALSE)
- 把mtupper的行名和列名改为NULL。
colnames(mtupper) <- c("NULL","NULL")
rownames(mtupper) <- c("NULL","NULL")
- mtupper每一行求和,存入mtsum。
mtsum <- apply(mtupper,MAGIN =1,FUN=sum)
- 使用for循环,输出向量1:100中所有数据。
#用for实现
for(i in 1:100){
print(i)
}
#用while实现
while (i<=100) {
sum <- sum+i
i <- i+1
}
print(sum)
#用repeat实现
repeat{
if(i%%2!=0)sum <- sum+i
i <- i+1
if(i>100)break
}
print(sum)
- 使用while循环求1+2+3+…+100的和。
i <- 1
sum <- 0
while(i <= 100){
sum <- sum + i
i <- i + 1
}
print(sum)
- 使用repeat循环求1至100之间的奇数和。
i <- 1 ;
sum <- 0;
repeat{
sum <- sum + i;
i <- i + 2
if(i > 100){
break
}
}
sum
- 使用for循环输出1至100之间的能够被3或5整除的数,并求和。
sum <- 0
for(i in 1:100){
if(i %% 3 == 0 | i %% 5 == 0){
print(i);
sum <- sum + i;
}
}
sum
【附录】:
数据:
身高体重数据
weight height
4.17 1.75
5.58 1.8
5.18 1.65
6.11 1.9
4.5 1.74
4.61 1.91
5.17 1.75
4.53 1.8
5.33 1.65
5.14 1.9
4.81 1.74
4.17 1.91
4.41 1.75
3.59 1.8
5.87 1.65
3.83 1.9
6.03 1.74
4.89 1.91
4.32 1.75
4.69 1.8
3.2 课后作业:黄皮书:P105-106,第2.5和2.6题
T2.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.0,49.0,41.5,52.0,45.5);
students <- data.frame(Num,Name,Sex,Age,Height,Weight)
print(students)
T2.6 题目
下面代码运行不成功
#(1)
write.table(students,file="c:/data_students.txt")
#(2)
read.table("c:/data_students.txt")
#(3)
write.csv(students,file="c:/data_students.csv")
#(4)
read.csv("c:/data_students.csv")
四.上机(四)_0407_week6
4.1 课堂作业
一、10位同学的姓名、性别、年龄、身高、体重数据如下:
Name Sex Age Height Weight
Alice F 13 56.5 84.0
Sandy F 11 51.3 50.5
Sharon F 15 62.5 112.5
Tammy F 14 62.8 102.5
Alfred M 14 69.0 112.5
Duke M 14 63.5 102.5
Guido M 15 67.0 133.0
Robert M 12 64.8 128.0
Thomas M 11 57.5 85.0
William M 15 66.5 112.0
1.用数据框的形式读入数据,数据框的名称为my.class.
2.将上述数据写成一个纯文本的文件(文件名为class.txt),并用函数read.table()读取文件中的身高和体重数据。
#1.
my.class <- read.table("c:/students.txt",header=TRUE)
my.class
#2.
write.table(my.class,file="class.txt")
data1 <- read.table("class.txt",header=TRUE)
data1[c(4,5)]
二、用函数rep()构造一个向量x,它由5个3,10个2,98个1构成。
x <- c(rep(3,times = 5),rep(2,times= 10),rep(1,times=98));x
三、使用for循环输出1至100之间的能够被3或5整除的数,并求和。
sum <- 0;
for(i in 1:100){if(i %% 3 == 0 | i %% 5 == 0){print(i);sum <- sum + i}}
print(sum)
四、自己编写一个函数,求数据y=(y1,y2,…,yn)的均值、标准差、偏度与峰度。
install.packages("moments")#计算偏度与峰度的包
library(moments)
MyFunc <- function(y){
for(i in 1:length(y)){
a <- mean(y);
b <- sd(y);
c <- skewness(y);
d <- kurtosis(y);
}
sta <-c(a,b,c,d);sta
agostino.test(y) #偏度检验
anscombe.test(y) # 峰度检验
}
y <- c(runif(16))
MyFunc(y)
五、鸡兔同笼问题:鸡和兔子关在一个笼子里,已知共有头36个,脚100个,编程求笼内关了多少只兔子和多少只鸡?
key:了解鸡兔同笼的解题思路
chicken.num <- (4*36 -100) / 2 ;chicken.num
rabbit.num <- 36 - chicken.num;rabbit.num
六、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。编程求第一天共摘多少桃子?
peach.num <- function(x){
y <- 1;
for(i in 1:(x-1)){
y <- 2*(y+1)
}
y;
}
peach.num(10)
七、
下面代码不知道为什么报错
install.packages("rootSolve")
library(rootSolve)
model <- function(x,esp=1e-5){c(F1=x[1]^2)+x[2]^2-5,F2=(x[1]+1)*x[2]-(3*x[1]+1)}
multiroot(model,t(c(0,1)))
八、画出身高的散点图和茎叶图,再画出体重盒形图和直方图。(身高体重数据见附录)
par(mfrow=c(2,2))
data <- read.table("c:/appendix.txt",header = TRUE)
data
Weight <- data[,'weight']
plot(Weight,main="身高的散点图")
stem(Weight)
height <- data[,'height']
boxplot(height,main="体重的盒型图")
hist(height,main="体重的直方图")
附录:
身高体重数据
weight height
4.17 1.75
5.58 1.8
5.18 1.65
6.11 1.9
4.5 1.74
4.61 1.91
5.17 1.75
4.53 1.8
5.33 1.65
5.14 1.9
4.81 1.74
4.17 1.91
4.41 1.75
3.59 1.8
5.87 1.65
3.83 1.9
6.03 1.74
4.89 1.91
4.32 1.75
4.69 1.8
4.2 课后作业:黄皮书:P106 第2.7题
T2.7 题目
Myfunc <- function(n){
if (n <= 0)
list(tips1 = "要求输入一个正整数")
else {
repeat {
if (n == 1)
break;
if (n %%2 == 0) {
n = n / 2;
}else{
n = 3 * n + 1
}
}
list(tips2 = "Operation success")
}
}
Myfunc(8)
五.上机(五)_0414_week7
5.1 课堂作业( 较难!)
- 数据的读取(数据见附录)
data1 <- read.table("c:/appendix.txt",header=TRUE);data1
- 绘图它们的回归曲线,并预测在weight 等于6.85时身高等于多少?
height <- t(data1[,"height"])
weight <- t(data1[,"weight"])
plot(data1$height,data1$weight)
whlm = lm(weight~height,data = data1)
attach(data1)
plot(weight~height)
abline(whlm,col = 'red',lw = 2)
summary(whlm)
#预测在weight 等于6.85时身高的值。
y <- (x -8.364) / (-1.965)
x <- 6.85
y
由Coefficients这一块可以得出回归曲线方程为: y=-1.9965*x+8.364,故根据方程,可以预测在weight 等于6.85时身高的值。
- 更改绘图的参数的取值,在一张图里绘制7种不同线性和颜色的图形出来,并给出标题。
plot(0,0,type="n",xlim=c(0,12),ylim=c(0,12))
for(i in 1:7){
abline(-9+2*i,1,col=i,lty=i)
points(9.5-i,0.5+i,col=i,pch=i)
}
title(main='linecol_plottest')
4.根据cityrain数据作图。令Y轴范围(0,300),xaxt=“n”,type=“b”,颜色为黑,X轴标题为“Month”,Y轴标题为“Tokyo Rainfall(mm)”,主标题“Monthly Rainfall in major cities”。用axis()函数添加X轴,使在X轴1到12的位置分别对应12个月份。
找不到数据,暂时无法实现
rain <- read.csv("cityrain.csv")
plot(rain$Tokyo,type="b",xaxt="n",ylim=c(0,300),col="black",xlab="Month",ylab="Rainfall(mm)",main="Monthly Rainfall in major cities")
axis(1,at = 1;12,labels = rain$Month)
#注:由于时间有点紧张,找不到合适的数据,故仅将题目意思用代码体现出来。
- 在[0,4pi]画sin(x),cos(x)(在同一个图象中); 其中sin(x)和cos(x)图象用不同的颜色和形状表示,并在函数图上适当的位置标注 “箭头+y=sin(x)”, “箭头+y=cos(x)” ,标记x轴,y轴,标题为“正弦余弦函数图象”.
plot(sin,0,4*pi,main="正弦余弦函数图像",xlab="x轴",ylab="y轴",col=c("red","blue"),type="o",pch=18)
curve(cos,0,4*pi,col="blue",type="b",pch=1,add=T)
arrows(3.3,0.8,2.3,0.8)
text(3.8,0.8,"sin(x)")
arrows(10.8,0.8,11.8,0.8)
text(10,0.8,"cos(x)")
- 从软件包mass中导入数据文件Animals。在一页中对body作出qqnorm图、直方图、Boxplot;
对body和brain作qqplot图,要求给出标题、坐标轴等。
下面代码有点问题,待改
install.packages("MASS")
library(MASS)
animals <- data(Animals)
attach(animals)
body <- animals[,"body"]
qqnorm(body,main="body qqnormplot")
hist(body,main="body histplot")
boxplot(body,main="body boxplot")
brain <- animals[,"brain"]
qqplot(body,brain,main="body-brain Q-Q Plot",xlab="body",ylab="brain")
- 10位同学的姓名、性别、年龄、身高、体重数据如下:
Name Sex Age Height Weight Alice F 13 56.5 84.0 Sandy F 11
51.3 50.5 Sharon F 15 62.5 112.5 Tammy F 14 62.8 102.5 Alfred M 14 69.0 112.5 Duke M 14 63.5 102.5 Guido M 15
67.0 133.0 Robert M 12 64.8 128.0 Thomas M 11 57.5 85.0 William M 15 66.5 112.0
1.用数据框的形式读入数据,数据框的名称为my.class
my.class <- read.table("c:/data2.txt",header=TRUE)
my.class
2.在一页中画出性别的频数条形图、画出身高的散点图、画Weight茎叶图、绘制Age盒形图、绘制Weight直方图,并求体重对身高的回归。要求给出标题、坐标轴等。
par(mfrow=c(3,2),cex=0.6)
b<- table(my.class$Sex)
barplot(b,main="Sex的频数条形图")
height <- my.class[,Height]
plot(height,main="身高的散点图")
weight <- my.class[,Weight]
stem(weight)
age <- my.class[,"Age"]
boxplot(age,main="Age的盒型图")
hist(weight,main="Weight的直方图")
plot(height,weight,main="体重对身高的回归",xlab="身高",ylab="体重")
不知道为什么,茎叶图没法一起合并到上面的图
- 将屏幕分割为四块,并分别画出(要求给出标题、坐标轴、参数如oma、mar、col、pch、main、legend、lty、type、merge等)
y=sin(x), z=3*cos(x), a=sin(x)*cos(x), b=sin(x)/x。
par(mfrow=c(2,2))
curve(sin(x),0,4*pi,type="l",col="orange",lty=1,xlab="x",ylab="y",main="y=sin(x)图像")
curve(3*cos(x),0,4*pi,type="l",col="blue",lty=2,xlab="x",ylab="z",main="z=3*cos(x)图像")
curve(sin(x)*cos(x),0,4*pi,type="l",col="pink",lty=6,xlab="x",ylab="a",main="a=sin(x)*cos(x)图像")
curve(sin(x)/x,0,4*pi,type="l",col="red",lty=4,xlab="x",ylab="b",main="b=sin(x)/x图像")
附录:
数据:
1 身高体重数据 weight height
4.17 1.75
5.58 1.8
5.18 1.65
6.11 1.9
4.5 1.74
4.61 1.91
5.17 1.75
4.53 1.8
5.33 1.65
5.14 1.9
4.81 1.74
4.17 1.91
4.41 1.75
3.59 1.8
5.87 1.65
3.83 1.9
6.03 1.74
4.89 1.91
4.32 1.75
4.69 1.8
5.2 课后作业:黄皮书:P160 第3.3题
T3.3 题目
其中:
第3.1题的数据如下:
思路:首先将数据读入,然后画出茎叶图,箱线图和计算五数总括。
data <- read.table("c:/data.txt")
data
stem(data) #画茎叶图
boxplot(data) #画箱线图
data2 <- unique(sort(unlist(as.list(data))))
data2
fivenum(data2) #计算五数总括
在画箱型图以及计算五数总括时,出现上述报错。解决方法:将data.frame数据转化为向量,然后再进行画图与五数总括的计算,此时,程序运行成功。
(结果如下图)