R语言 

一、数组 

> x=c(1:6)
> x
[1] 1 2 3 4 5 6
> is.vector(x)                                      #判断x是一个向量
[1] TRUE
> is.array(x)                                        #判断x不是一个数组
[1] FALSE
> dim(x) <-c(2,3)                                #使用dim (x)赋值一个(2,3)数组
> x
    [,1] [,2] [,3]
[1,]   1    3    5
[2,]   2    4    6
> is.array(x)                                        #再次判断x是否是数组
[1] TRUE
> is.matrix(x)                                      #判断x是否是矩阵(注意:矩阵是数组的特殊情况)
[1] TRUE

 

二、数据框

 数据框和矩阵的区别是:数据框是有字符和数字组成的,而矩阵全是数字组成的。

在统计学了,数据框更能体现它的样子。

在这里可以数据组成一个数据框使用data.frame(x1,x2)函数来指定x1 and x2两个向量,

向量可以是字符型和数字型。(注意:x1 and x2向量的长度必须相等

 

可以使用(x=data.frame(‘重量’=x1,’运费’=x2)) 来替换x1 and x2的列头,相当于sql语句中的

字段的别名。(注意:跟sql不一样的地方是它是直接替换掉了,但sql只是个别名)

 

三、画散点图

 函数plot()

 这个函数主要的作用是用来画图的。(在后续讲解)

 

四、读文本文件数据

 函数 read.table()

>(X=read.table("/root/R/2/abc"))
  V1V2
1 176 85
2 168 80
3 156 60
4 167 60
5 170 90
6 171 95

 

读剪切板操作

> y<-read.table("/root/R/2/abc",header=F)             #header是不读列头
> y
  V1V2
1 176 85
2 168 80
3 156 60
4 167 60
5 170 90
6 171 95

 

 

读excel文件数据另类方法

 1、 先安装ODBC源

apt-get installunixodbc unixodbc-dev

2、安装JDK包

1、创建java目录

mkdir /usr/java

2、解压包到/usr/java

tar –zxvf jdk-8u91-linux-x64.gz

3、在/etc/profile 文件下创建java环境变量(注意:在尾部加入,重启系统生效)

JAVA_HOME=/usr/java/jdk1.8.0_91
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib
export JAVA_HOME
export PATH
export CLASSPATH

 

 

2、 安装rjava包和xlsx包

执行命令:R CMD javareconf

root@strom-virtual-machine:/usr/java#R CMD javareconf
Java interpreter: /usr/java/jdk1.8.0_91/jre/bin/java
Javaversion     : 1.8.0_91
Java homepath   : /usr/java/jdk1.8.0_91
Javacompiler    : /usr/java/jdk1.8.0_91/bin/javac
Java headersgen.: /usr/java/jdk1.8.0_91/bin/javah
Java archivetool: /usr/java/jdk1.8.0_91/bin/jar
 
trying tocompile and link a JNI program 
detected JNI cppflags    : -I$(JAVA_HOME)/include-I$(JAVA_HOME)/include/linux
detected JNIlinker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99-I/usr/share/R/include -DNDEBUG -I/usr/java/jdk1.8.0_91/include-I/usr/java/jdk1.8.0_91/include/linux    -fpic  -g -O2-fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
gcc -std=gnu99-shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o conftest.soconftest.o -L/usr/java/jdk1.8.0_91/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib-lR
JAVA_HOME        : /usr/java/jdk1.8.0_91
Java librarypath: $(JAVA_HOME)/jre/lib/amd64/server
JNI cppflags    : -I$(JAVA_HOME)/include-I$(JAVA_HOME)/include/linux
JNI linker flags: -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
Updating Javaconfiguration in /usr/lib/R
Done.

进入R语言环境安装rjava和xlsx包

         install.packages("rJava")

         install.packages("xlsx")

安装顺利的话就结束了

        

3、 使用read.xlsx() 函数读xlsx文件

>read.xlsx(file="/root/R/02/text.xlsx",header=T,sheetIndex=1)
  X170 X45
1  165  80
2  168  70
3  169  85

 

五、循环语句

 For语句

> a <-c(1,59)                                               #将向量1到59赋值给a
> for (i in 1:59) {a[i]=i*2+3}                     #循环执行1到59的值,每次值*2+3
> a
 [1]  5   7   9 11  13  15 17  19  21 23  25  27 29  31  33 35  37  39  41
[20] 43  45  47 49  51  53 55  57  59 61  63  65 67  69  71 73  75  77  79
[39] 81  83  85 87  89  91 93  95  97  99101 103 105 107 109 111 113 115 117
[58] 119 121

 

 While语句

> a[1]=5                                                      
> i=1
> while (a[i]<121){i=i+1;a[i]=a[i-1]+2} #满足a的值小于121才能进入循环体执行
> a
 [1]  5   7   9  11 13  15  17 19  21  23 25  27  29 31  33  35 37  39  41
[20] 43  45  47 49  51  53 55  57  59 61  63  65 67  69  71 73  75  77  79
[39] 81  83  85 87  89  91 93  95  97  99101 103 105 107 109 111 113 115 117
[58] 119 121

 

六、执行R脚本

使用函数source() 、print()

root@strom-virtual-machine:~/R/02#cat text.r
a <- c(1,59);
a[1]=5;
i=1;
while(a[i]<121) {i=i+1;a[i]=a[i-1]+2};
print(a);

 

 

七、综合性例子

模拟产生统计专业同学的名单(学号区分),记录数学分析,线性代数,概率统计十三科成绩,然后进行一些统计分析

>num=seq(10378001,10378100)                   #代表100个学号
> num
  [1] 10378001 10378002 10378003 1037800410378005 10378006 10378007 10378008
  [9] 10378009 10378010 10378011 1037801210378013 10378014 10378015 10378016
 [17] 10378017 10378018 10378019 1037802010378021 10378022 10378023 10378024
 [25] 10378025 10378026 10378027 1037802810378029 10378030 10378031 10378032
 [33] 10378033 10378034 10378035 1037803610378037 10378038 10378039 10378040
 [41] 10378041 10378042 10378043 1037804410378045 10378046 10378047 10378048
 [49] 10378049 10378050 10378051 1037805210378053 10378054 10378055 10378056
 [57] 10378057 10378058 10378059 1037806010378061 10378062 10378063 10378064
 [65] 10378065 10378066 10378067 1037806810378069 10378070 10378071 10378072
 [73] 10378073 10378074 10378075 1037807610378077 10378078 10378079 10378080
 [81] 10378081 10378082 10378083 1037808410378085 10378086 10378087 10378088
 [89] 10378089 10378090 10378091 1037809210378093 10378094 10378095 10378096
 [97] 10378097 10378098 10378099 10378100

 

使用runif和rnorm 函数

ruif() 函数是均匀分布函数

>x1=round(runif(100,min=80,max=100))  
#使用均匀分布100个元素,下线是80 ,上线是100,最后四舍五入
> x1
  [1] 88  83  83 95  92  97 91  99  93 95  85  99 85  90  86 87  91  98
 [19] 83  99  90 82  80  89 92  85  80 90  80 100  86 93  99  80 87  93
 [37] 96  88  96  96  91 95  83  88 95  93  91 86  85  85 93  82  97  89
 [55] 96  83  85 95  87  83 88  90  98 96  95  86 84  95  92 92  86  82
 [73] 90  96  87 93  87  91 80  86  92 81  81  95 95  97  93 83  98  90
 [91] 100 96  95  87 90  93  86 89  95  87


 

rnorm() 函数是正太分布函数

>x2=round(rnorm(100,mean=80,sd=7))   
#正太分布100个元素,平均值是80分,标准差是7,最后四舍五入
> x2
  [1] 75  77  78 96  86  80 73  78  84 88  72  77 73  71  75 63  84  77
 [19] 65  75 100  84 76  87  73 74  83  80 72  76  71 76  95  94 79  74
 [37] 81  89  75 77  80  69 74  73  89 74  90  83  76  67 69  77  82  83
 [55] 76  89  74 74  82  73 86  80  69 82  72  78 85  74  77 86  71  86
 [73] 80  83  75 71  74  87 82  80  85 81  80  74 78  77  94 71  72  78
 [91] 88  76  76 89  88  73 74  80  89  75

 

>x3=round(rnorm(100,mean=83,sd=18))

#正太分布100个元素,平均值是83,标准差是18,最后四舍五入

(注意:正太分布没有上线跟下线的概念,而这里只有平均值和标准差,所以这里超出100)

> x3
  [1] 65  97  73 81  85 122  74 92  87 103  52 78  66  81 121 97 118  90
 [19]  64104  90 100  73 83  67  97 77  79  68 110 121 72  85  91  73142
 [37] 86  78  90 70  72  98 100 99  26  91 68  82  80  68109  78 63  89
 [55] 82  83 109  64  69118  93 87 103  94  92 84  75  72 88  62 102  79
 [73] 63  87  88  96100 111  51  64 106 108 73  69 101  80 112 49 109 100
 [91] 82  66  47 53  67  89 70  75  69  77

 

>x3[which(x3>100)]=100   #把超过100分的值全部替换成100

> x3
  [1]  65 97  73  81  85100  74 92  87 100  52 78  66  81 100 97 100  90
 [19]  64100  90 100  73 83  67  97 77  79  68 100 100 72  85  91  73100
 [37] 86  78  90 70  72  98 100 99  26  91 68  82  80  68100  78 63  89
 [55] 82  83 100  64  69100  93 87 100  94  92 84  75  72 88  62 100  79
 [73] 63  87  88  96100 100  51  64 100 100 73  69 100  80 100 49 100 100
 [91] 82  66  47 53  67  89 70  75  69  77

 


合成数据框并保存到硬盘上

使用的函数是data.frame() 、write.table()

>x=data.frame(num,x1,x2,x3)               #使用数据框进行输出值
> x
         num x1  x2  x3
1   10378001 88  75  65
2   10378002 83  77  97
3   10378003 83  78  73
4   10378004 95  96  81
5   10378005 92  86  85
6   10378006 97  80 100
7   10378007 91  73  74
8   10378008 99  78  92
9   10378009 93  84  87

 

>write.table(x,file="/root/R/02/mark.txt",col.names=F,row.names=F,sep="")

使用write.table函数将data.frame(num,x1,x2,x3)写入到/root/R/02/mark.txt文件中

        

计算各科平均分

使用函数mean()、colMeans()、apply()

>mean(x)                 #算出各科的平均值
num                       x1          x2          x3
10378050.50       90.88       88.56       89.10
 
>colMeans(x)          #对列求平均值
num                       x1            x2          x3
10378050.50       89.88       78.56       79.10
 
> colMeans(x)[c("x1","x2","x3")]                  #求出x1,x2,x3的平均值,学号去除
x1        x2      x3
89.88  78.56

 

>apply(x,2,mean)                            

#在x框上对列做平均值

(注意:“2”表示在列上做平均值,“1”表示行)

num              
10378050.50      89.88       78.56       79.10
 
> apply(x,2,max)            #在列上求最大值(最高分)
num                  x1      x2       x3
10378100     100       96     100
 
 
> apply(x,2,min)               #在列上求最小值(最低分)
num                 x1      x2       x3
10378001       81       58      28
 
> apply(x[c("x1","x2","x3")],1,sum)
#先把x1,x2,x3值取出后,在每一行值算出和
  [1] 275 260 231 259 253 251253 225 265 271 228 276 265 237 252 239 240 280
 [19] 234 277 244 252 263 242282 270 241 283 233 240 226 222 241 250 275 221
 [37] 244 265 244 230 208 267229 250 275 267 207 262 233 280 218 263 222 266
 [55] 240 224 259 236 249 226256 262 232 249 255 233 244 260 271 244 228 198
 [73] 215 258 226 242 260 237227 276 272 262 261 271 244 253 247 250 226 227
 [91] 265 217 221 260 238 244237 242 261 263