R语言第二章 数组、数组框、文本读、循环语句使用

来源:互联网 发布:淘宝代运营提成几个点 编辑:程序博客网 时间:2024/05/02 06:31

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 79.10

 

>apply(x,2,mean)                            

#在x框上对列做平均值

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

num                          x1         x2          x3

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

 

 

 

 

 

0 0