内容:
A.3, A.10, A.12
A.3 上机实践:将MASS数据包用命令library(MASS)加载到R中,调用自带“老忠实”喷泉数据集geyer,它有两个变量:等待时间waiting和喷涌时间duration,其中… (1) 将等待时间70min以下的数据挑选出来;
(2) 将等待时间70min以下,且等待时间不等于57min的数据挑选出来; (3) 将等待时间70min以下喷泉的喷涌时间挑选出来; (4) 将喷涌时间大于70min喷泉的等待时间挑选出来。 解:读取数据的R命令:
library(MASS);#加载MASS包 data(geyser);#加载数据集geyser
attach(geyser);#将数据集geyser的变量置为内存变量 (1) 依题意编定R程序如下:
sub1geyser=geyser[which(waiting<70),1];
#提取满足条件(waiting<70)的数据,which(),读取下标 sub1geyser[1:5];#显示子数据集sub1geyser的前5行 [1] 57 60 56 50 54
(2) 依题意编定R程序如下:
Sub2geyser=geyser[which((waiting<70)&(waiting!=57)),1]; #提取满足条件(waiting<70& (waiting!=57)的数据. Sub2geyser[1:5];#显示子数据集sub1geyser的前5行 [1] 60 56 50 54 60 ……
原数据集的第1列为waiting喷涌时间,所以用[which(waiting<70),2] (3)
Sub3geyser=geyser[which(waiting<70),2];
#提取满足条件(waiting<70)的数据,which(),读取下标 Sub3geyser[1:5];#显示子数据集sub1geyser的前5行 [1] 4.000000 4.383333 4.833333 5.450000 4.866667……
原数据集的第2列为喷涌时间,所以用[which(waiting<70),2] (4)
Sub4geyser=geyser[which(waiting>70),1];
#提取满足条件(waiting<70)的数据,which(),读取下标 Sub4geyser[1:5];#显示子数据集sub1geyser的前5行 [1] 80 71 80 75 77……. A.10
如光盘文件student.txt中的数据,一个班有30名学生,每名学生有5门课程的成绩,编写函数实现下述要求:
(1) 以data.frame的格式保存上述数据;
(2) 计算每个学生各科平均分,并将该数据加入(1)数据集的最后一列; (3) 找出各科平均分的最高分所对应的学生和他所修课程的成绩;
(4) 找出至少两门课程不及格的学生,输出他们的全部成绩和平均成绩;
(5) 比较具有(4)特点学生的各科平均分与其余学生平均分之间是否存在差异。 先将数据集读入R系统
student=read.table(\…\
class(student):#显示数据集student的类型,
[1] \是数据框
names(student);#显示数据框student的变量
[1] \ \ \ \#输出显示,数据框student有7个变量,第7个变量是平均值mean。 (1)
write.table(student,\非参数统计\\\\data2014\\\\各章数据\\\\附录A\\\\x.txt\打开x.txt
\\\……
(2) 依题意,要为原始数据集添加一个变量,即添加一列在最后。?[,6]=? me=rep(0,30);
for(i in 1:30){x=as.numeric(student[i,2:6]); me[i]=mean(x);} student$mean=me;
#上面程序的最后一行也可以如此:student[,7]=me names(student);
[1] \ \ \ \ #如上显示,程序运行后数据框student添加了第7列mean.
(3) 依题意,在(2)的程序运行后做,要用到which(mean==max(mean)),如同A.3。 attach(student);
maxme=student[which(mean==max(mean)),];#找出最高平均分的记录,并赋予maxme; maxme;
name math physics chem literat english mean
15 Liggle 78 96 81 80 76 82.2
(4) 依题意,要用到二重的for和if. 由原数据框geyser给data1赋值时要用到数据转换: #x=as.numeric(student[i,2:6]);#读取student第i行2:6列的数据,#data1[k,]=x;#将x赋给data4 #的第k行。sum(x<60)是不及格门数。 Data1=student[1,];#赋初值 k=0;
for(i in 1:30){x=as.numeric(student[i,2:6]);
if (sum(x<60)>1){k=k+1;data1[k,]=student[i,];}} data1
name math physics chem literat english mean
1 Ricky 67 63 49 65 57 60.2 7 Simon 66 71 67 52 57 62.6 9 Jed 83 100 79 41 50 70.6 10 Jack 86 94 97 51 55 76.6 12 Jetty 67 84 53 58 56 63.6 13 Corner 81 62 69 56 52 64.0 14 Osten 71 64 94 52 52 66.6 25 Amon 74 79 95 59 59 73.2
(5) 依题意,要创造两个子集data4和data2, 用两样本的比较方法比较他们的平均成绩是否有显著差异。类似创造data1的方法,创造data2。并设x=data1$mean,y=data2$mean,比较二样本x,y是否有显著差异,由于还没有学非参数检验,试用t检验检验之(R的t检验函数为t.test(x,y),原假设H0是两样本的均值相等,备择假设H1是两样本不等)。如果P值p-value<0.05,则拒绝原假设。 data2=student[1,];k=0;
for(i in 1:30){x=as.numeric(student[i,2:6]);
if (sum(x<60)<2){k=k+1;data2[k,]=student[i,];} };
下面做t检验
x=data1$mean;y=data2$mean; t.test(x,y)
Welch Two Sample t-test data: x and y
t = -3.0236, df = 9.309, p-value = 0.01386
alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -11.493236 -1.684037
sample estimates: mean of x mean of y : 67.17500 73.76364
结论:p-value = 0.01386<0.05,拒绝原假设,即认为两样本的平均成绩有显著差异。
A.12 在一张图上,用取值(-10,10)之间间隔均等的1000个点,采用不同的线型一颜色给制sin(),cos(),sin()+cos()的函数图形,图形要求有主标题和副标题,标示出从坐标 x=seq(-10,10,length=50);#构造向量x, x[1:5];#显示x的前5个数据
[1] -10.00000 -9.97998 -9.95996 -9.93994 -9.91992 sin=sin(x);#计算sin函数值 cos=cos(x);
sc=sin(x)+cos(x);
plot(sin~x,xlab=\lines(cos~x,type=\点线图 lines(sc~x,type=\title(\三角函数图\
所得图形如下图,sin为黑色,cos为红色,sin+cos为绿色: