R语言与数据分析(一)


喜欢一件事就去争取吧。

1. 课程介绍

2. 数据分析

数据就是事物进行记录可鉴别的符号,是对客观事物性质状态以及相互关系等进行记载的物理符号。

数据分析过程

  1. 数据的采集
  2. 数据的存储
  3. 数据统计:使用统计方法,有目的的对收集的数据进行分析处理,并解读分析结果。结绳、算盘、计算器、excel
  4. 数据挖掘:一般是指从大量的数据中通过算法搜索隐藏于其中的信息的过程。挖掘是一个探索的过程,统计是有目的的。
  5. 数据的可视化
  6. 进行决策,利用统计结果进行有目的的决策

3. 数据挖掘

介绍了数据挖掘的重要性。

4. 数据可视化

人是视觉动物

5. R语言介绍

  1. 有效的数据处理和保存机制。
  2. 拥有一整套数组和矩阵的操作运算符
  3. 一系列连贯而又完整的数据分析中间工具
  4. 图形统计可以对数据直接进行分析和显示,可用于多种图形设备
  5. 一种相当完善、简介和搞笑的程序设计语言
  6. R语言是彻底的面向对象的统计编程语言
  7. R语言和其他变成语言、数据库之有很好的接口
  8. R语言是自由 的软件,功能不比任何其他同列软件差
  9. R语言的网上资源丰富

Rebolutions R 已经被微软收购了,该命为Microsoft R

6. R应用的案例

一个维生素C与牙齿生长的关系

在官网上面下载R语言的安装包,

7. R语言的安装

不着急,这个在网络上有大量的资源

8. R 运行与设置

讲述了R自带的GUI

9. Rstudio

一般都是用到了这个软件, 介绍了各种界面的操作。

10 基本操作

设定工作目录,查看工作目录

getwd()

设置工作目录,填入你的工作目录

setwd(dir = “”)

列出每个变量的所有信息

ls.str()

11. R扩展包

查看扩展包的位置

.libPaths()

查看安装了哪些安装包

library()

一次安装多个包

install.packages(c(“AER”,”ca”,””)

12 R包的使用

R软件包的组成

  • base
  • datasets 存放R内置的数据集
  • utils R语言的工具函数
  • grDevices 基于base 和greph的图形设备,与绘图相关的函数都在这个包里
  • graphics 基于base图形的R默认的绘图函数都在这个包里
  • stats 存放与统计相关的函数,
  • methods R对象一般的定义方法和类
  • splines 基础包
  • stats4 基础包
  • tcltk 基础包

广州,兰州,的镜像是可以用的,兰州是比较快的.

加载包

require(vcd)

移除加载

detach(“package:vcd”)

删除包

remove.package(“vcd”)

查看以安装的包

installed.packages()

查看工具包的帮助信息

help(package=”vcd”)

也可以用library来查看帮助信息

library(help=”vcd”)

列出vcd中所有包含的函数

ls(“package:vcd”)

列出vcd中所有的数据集

data(package=”vcd”)

R包的批量移植

一种方案:

Rpackage <- installed.packages()[,1]
save(Rpackage,file=”Rpack.Rdata)

列出安装包的第一列,导出到一个文本中,在另一个电脑上load加载到一个变量中,

for (i in Rpack) install.packages(i)
这样就可以批量安装包了.

13 获取帮助

比如help()会在浏览器中打开帮助信息,和?sum一个意思

help(sum)

?(sum)

快速了解函数的参数,而不想去看文档args函数

args(plot)

还可以用esample 函数去示例一个函数的使用

example(hist)

也可以用demo 这种示例

demo(graphic)

用help查看包的帮助,这个是在网上查看帮助信息

help(package=vcd)

用vignette()函数,这个一些库可能没有这个文档,

vignette(“vcd”)

??qplot

网络搜索相关的函数

RSiteSearch(“matlab”)

rseek.org 是一个与R相关的论坛

14 excel 案例

主要是excel 数据透视表的使用案例,没有数据不是很懂,老师也说了,excel也是一种很强大的数据分析工具,也可以学习excel的使用

15 内置数据集

R内置了很多的数据集,存在于datasets这个包中

直接data()就可以列出很多的数据集,rivers可以列出北美141条河流的长度

可以用help("mtcars")这样的去查看数据的帮助信息

加载数据集

data(package=”MASS”)

这样只是加载数据集,而包就不用加载进来

data(Chile,Package=”car”)

16 数据结构

数据结构式计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素集合。

这个是很重要的,知道是什么,知道为什么。

R中数据类型

  1. 数值型,数值可以用于直接计算。
  2. 字符串型,可以进行连接,转换,提取等。
  3. 逻辑型,真假。
  4. 日期型等。

这个跟Python差不多。

普通的数据结构:向量,标量,列表,数组,多维数组。

特殊数据结构:perl中的哈希,python中的字典,c语言中的指针等。

R对象:object, 他是指可以赋值给变量的任何事物,包括常量,数据结构,函数,甚至图形。对象都拥有某种模式,描述了此对象是如何存储的,以及某个类。

17 向量

向量,vector, 是R中最重要的一个概念,它是构成其他数据结构的基础,R中的向量概念和数学中的向量是不同的,类似于数学上的集合,有一个或多个元素所构成。向量其实是用于存储数值型,字符型或逻辑型数据的一维数组。

R中用函数 “c ”来创建向量。如:

c <- c(1,2,3,4)
z <- c(TRUE,T,F)

R中 euro,rivers,state.abb,state.area都是向量的数据结构。

等差数列,输出1到100的等差数列

c(1:100)

输出步长为2的等差数列

seq (from=1,to=100,by=2)

输出重复序列,x重复5次

rep (“x”,5)
rep (x,5)

可以用each来控制一个元素的重复次数。如下可以吧x中的元素重复5次,times可以把整数组重复2次。

rep(x,each=5,times=2)

如何查看数据类型,

mode(z)

R中向量化编程

x <- c(1,2,3,4,5)
y <- c(6,7,8,9,10)
x*2+y
8 11 14 17 20

在x中取出x>3的值

x[x>3]

使用rep来控制每个元素的出现次数

rep(x,c(2,4,6,1,3))
输出[1] 1 1 2 2 2 2 3 3 3 3 3 3 4 5 5 5

18 向量索引

在R中元素的第一个值是从 “1” 开始,不是0length(x)可以算出元素的个数。
如:x为1-100的元组

x[c(1,23,55,32,78)]
[1] 1 23 54 65 输出

重要使用逻辑向量的值来进行向量的索引。比如:

y <- c(1:10)
y[c(T,F,T,F,T,F,T,T,T,T,T)]
[1] 1 3 5 7 8 9 10 NA 输出为真的数字 NA为缺失值

又比如

z <- c(“one”,”two”, “three”, “four”, “five”)
z
[1] “one” “two” “three” “four” “five”
z %in% c(“one”,”two”) 判断是否在z中有这个字符。
[1] TRUE TRUE FALSE FALSE FALSE

使用元素名称进行访问,相当于字典中的键值对

> y <- c(1:6)
> names(y) = c("noe", "two", "three", "four", "five", "six")
> y
  noe   two three  four  five   six 
    1     2     3     4     5     6 
> names(y)
[1] "noe"   "two"   "three" "four"  "five"  "six" 
> y["two"]
two 
  2 

append函数,可以指定在那个位置进行插值。

> x <- c(1:100)
> v <- c(1:3)
> v[15] <- 15
> v
 [1]  1  2  3 NA NA NA NA NA NA NA NA NA NA NA 15
> append(x = v, values = 50,after = 12)
 [1]  1  2  3 NA NA NA NA NA NA NA NA NA 50 NA NA 15
>

删除向量可以用rm()函数,也可以在索引中加负号,但只是暂时的,但是可以传回原来的值

> rm(y)
> y <- c(1:10)
> y[-c(1:3)]
[1]  4  5  6  7  8  9 10

> y <- y[-c(1:3)]
> y
[1]  4  5  6  7  8  9 10

19 向量的运算

“**”为幂运算
“%%”求余运算
“%/%”为整除运算

两个元素的相加必须是相同的元素个数。python中这个还是很好解决的

> x = c(1,2,3)
> y = c(1,2,4,5,6)
> x>y
[1] FALSE FALSE FALSE FALSE FALSE
Warning message:
In x > y : 长的对象长度不是短的对象长度的整倍数

> c(1,2,3) %in% c(1,2,4,5,6)
[1]  TRUE  TRUE FALSE

其他的函数运算

> abs(-6) 为绝对值
[1] 6
> sqrt(25)  开方
[1] 5
> log(16,base=2)
[1] 4
> log2(16)  对数函数
[1] 4
> ceiling(c(-2.3,3.1415))  返回整数部分
[1] -2  4
> sin(x)  三角函数
[1] 0.8414710 0.9092974 0.1411200
> vec = 1:100
> sum(vec)  求和函数
[1] 5050
> range(vec)  范围,最大值和最小值
[1]   1 100
> max(vec)  最大值
[1] 100
> min(vec)  最小值
[1] 1
> mean(vec)  均值
[1] 50.5
> var(vec)  方差
[1] 841.6667
> sd(vec)  标准差
[1] 29.01149
> median(vec)  中位数
[1] 50.5
> round(var(vec),digits = 2)  round默认是整数digits设置小数位数
[1] 841.67
> prod(vec)  各元素连续乘积
[1] 9.332622e+157
> quantile(vec,c(0.5,0.4,0.8))  分位数
 50%  40%  80% 
50.5 40.6 80.2

寻找元素位置which,返回索引

> t = c(1,5,4,7,2,9,6)
> which.max(t)
[1] 6
> which(t==7)
[1] 4

20 矩阵与数组

矩阵式一个按照长方阵列排列的复数或实数集合.向量是一维的,而矩阵式二维的,需要有行列.基本就跟excel中的数据表差不多.

内置矩阵数据集

> iris3
> state.x77
> heatmap(state.x77)  热图

matrix()创建矩阵

> m = matrix(1:20,4,5)  1到20,4行5列的矩阵
> m
     [,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

> m = matrix(1:20,4,5,byrow = T/F) 通过行或列

更改行列名称

> rname = c("1","2","3","4")
> cname = c("1","2","3","4","5")
> dimnames(m) = list(rname,cname)
> m
  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

dim()向量设定函数

设定为一个2行2列的3高的三维数组

> x = c(1:12)
> x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 
> dim(x)
NULL
> dim(x) = c(2,2,3)
> x
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9   11
[2,]   10   12

如何访问二维数组的值

> m
     [,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
> m[2,2]  二行二列
[1] 6
> m[2,]  二行
[1]  2  6 10 14 18
> m[,2]  二列
[1] 5 6 7 8
> m[-1,2]  "-"为去除第一列
[1] 6 7 8

> m+1  每个元素加一
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    6   10   14   18
[2,]    3    7   11   15   19
[3,]    4    8   12   16   20
[4,]    5    9   13   17   21

行列的计算

> colSums(m)  计算每一列的和
[1] 10 26 42 58 74
> rowSums(m)  计算每一行的和
[1] 45 50 55 60
> colMeans(m)  列的平均值
[1]  2.5  6.5 10.5 14.5 18.5
> rowMeans(m)  行的平均值
[1]  9 10 11 12

矩阵的内外积

> n = matrix(1:9,3,3)
> t = matrix(2:10,3,3)
> n
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> t
     [,1] [,2] [,3]
[1,]    2    5    8
[2,]    3    6    9
[3,]    4    7   10
> n*t  内积
     [,1] [,2] [,3]
[1,]    2   20   56
[2,]    6   30   72
[3,]   12   42   90

> n %*% t  外积
     [,1] [,2] [,3]
[1,]   42   78  114
[2,]   51   96  141
[3,]   60  114  168

其他

> diag(n)  对角线
[1] 1 5 9
> diag(t)
[1]  2  6 10

> m
     [,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
> t(m)  行列转换
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
[5,]   17   18   19   20

21-列表

列表顾名思义就是用来存储很多内容的集合,列表和数组基本是等同的,但是在R中,列表是最复杂的一种数据结构,也是非常重要的一种数据结构.

列表中可以存储若干个向量,矩阵,数据框,甚至其他的列表组合.

向量只能存储一种数据类型,列表却可以存储多种数据类型.

比如: 其实跟Python中的list是一样的

> a = 1:20
> b = matrix(1:20,4)
> c = mtcars
> d = "This is a test list"
> mlist = list(a,b,c,d)
> mlist
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

[[2]]
     [,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

[[3]]
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3

[[4]]
[1] "This is a test list"

mlist[[1]] 访问的数据本身,如果是一个中括号,则数据类型是一个list.所以给列表赋值的时候要两个中括号.

> mlist[[5]] = iris  
> mlist[-5]  就可以删除这个索引的值

22 数据框

数据框是一种表格式的数据结构,

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量.不同的行业对于数据集的行列叫法不同.

数据框实际上是一个列表.列表中的元素就是向量,这些向量构成数据框的列,每一列的长度相同,数据框的列是必须命名的.

比如excel中的数据表就是一个数据框,其中的每一列的元素格式可以不同.

矩阵的数据必须是一个类型,数据框可以不同,数据框的每一列必须是同一类型,每一行可以不同.

生成数据框

state = data.frame(state.name,state.abb,state.region,state.x77)

数据框的访问,基本是一样的

> state[1] 输出第一列
> state[c(2,4)]  输出2和4列
> state[,"state.abb"]
> state$state.abb  采用$符号的方式访问

与plot函数使用的实例,绘制women的身高体重散点图

plot(women$height,women$weight) 

teuy7t.png

不使用$符号的各种操作

attach加载与detach取消加载;可以在终端中直接敲数据框的名字就可以了,就可以摆脱$符号

> attach(mtcars)
> mpg  数据框的名称
 [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
[16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
[31] 15.0 21.4

with函数,不过要一个一个的加载,一般还是推荐使用$符号

> with(mtcars,{hp})
> hp
 [1] 110 110  93 110 175 105 245  62  95 123 123 180 180 180 205 215 230  66  52
[20]  65  97 150 150 245 175  66  91 113 264 175 335 109

关于单双括号的解释,就像使火车,单括号还是访问的火车中的车厢,双括号就相当于把车厢取出来单独使用.

23 因子

R中的因子使不好理解的

变量的分类

  1. 名义型变量:一般为字符串
  2. 有序型变量
  3. 连续型变量:一般为数值型

在R中名义型变量和有序型变量称为因子,factor. 这些分类变量的可能值称为一个水平,level,例如good,better,best,都称为一个level. 有这些水平值构成的向量就称为因子.

因子的应用

  • 计算频数
  • 独立性检验
  • 相关性检验
  • 方差分析
  • 主成分分析
  • 因子分析等

table频数统计.cyl就是一个因子,4,6,8就是水平

> mtcars$cyl
 [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
> table(cyl)
cyl
 4  6  8 
11  7 14 

factor 函数可以将向量函数转换成因子,按照顺序排列

> week = factor(c("Mon","Fri","Tuh","Wed","Mon","Fri","Sun"),ordered = T,levels = c("Mon","Tue","Wed","Thu","Fri","Sat","Sun"))
> week
[1] Mon  Fri  <NA> Wed  Mon  Fri  Sun 
Levels: Mon < Tue < Wed < Thu < Fri < Sat < Sun

水平

> fcyl = factor(mtcars$cyl)
> fcyl 
 [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8
[32] 4
Levels: 4 6 8

通过水平绘制柱状图,可以很好的进行频数统计

> fcyl = factor(mtcars$cyl)
> fcyl 
 [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8
[32] 4
Levels: 4 6 8
> plot(fcyl )

t861js.png

> num = 1:100
> cut(num,c(seq(0,100,10)))
  [1] (0,10]   (0,10]   (0,10]   (0,10]   (0,10]   (0,10]   (0,10]   (0,10]   (0,10]   (0,10]   (10,20]  (10,20]  (10,20]  (10,20]  (10,20] 
 [16] (10,20]  (10,20]  (10,20]  (10,20]  (10,20]  (20,30]  (20,30]  (20,30]  (20,30]  (20,30]  (20,30]  (20,30]  (20,30]  (20,30]  (20,30] 
 ...

state.divsion和state.region,也是factor的内置数据

24-缺失数据

缺失数据可分为

  • 完全随机缺失
  • 随机缺失
  • 非随机缺失
    缺失可能是设备故障,测量的问题导致的

NA表示缺失not available的简称,不是没有值,知识未知的数值.

统计的时候跳过缺失值,但是平均值的时候还是按照全部的值的个数计算的.

> a = c(NA,1:49)
> sum(a)
[1] NA
> sum(a,na.rm = TRUE)
[1] 1225
> mean(a,na.rm = TRUE)
[1] 25

na.omit()去除缺失值

> c = c(NA,1:20,NA,NA)
> c
 [1] NA  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
[22] NA NA
> d = na.omit(c)
> d
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
attr(,"na.action")
[1]  1 22 23
attr(,"class")
[1] "omit"

其他缺失数据

  1. 缺失数据NaN,代表不可能的值;
  2. Inf表示无穷,分为正无穷Inf和负无穷Inf,代表无穷大或者无穷小.
  3. Inf存在,是无穷大后者无穷小,但是表示不可能的值.
  • 可以用is.nan()来识别不可能值
  • 可以用is.infinite()来识别无穷值

25-字符串

R中可用的正则表达式

tJHIUS.png

统计字符串的长度,包括字符串

> nchar("hello world")
[1] 11

> nchar(month.name)  ## 可以返回向量的每个元素的长度,length不可以
 [1] 7 8 5 5 3 4 4 6 9 7 8 8
> length(month.name)
[1] 12

paste()可以把字符串相连

### paste() 后面的参数都会与变量的每个元素连接
> name = c("Moe","Larry","Curly")
> paste(name,"loves stats")
[1] "Moe loves stats"   "Larry loves stats" "Curly loves stats"

substr()提取字符,可以提取每一个元素的字符

### start 表示起始位置,stop表示终止位置
> substr(x = month.name,start = 1,stop = 3)
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct"
[11] "Nov" "Dec"

大小写tolower()toupper()和首字母大写

> temp = substr(x = month.name,start = 1,stop = 3)
> temp
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct"
[11] "Nov" "Dec"
> tolower(temp)
 [1] "jan" "feb" "mar" "apr" "may" "jun" "jul" "aug" "sep" "oct"
[11] "nov" "dec"
> toupper(temp)
 [1] "JAN" "FEB" "MAR" "APR" "MAY" "JUN" "JUL" "AUG" "SEP" "OCT"
[11] "NOV" "DEC"

### 首字母大写不是很好解决,可以用正则替换,perl = T表示支持perl语言的正则表达式
> gsub("^(\\w)","\\L\\1",tolower(temp),perl = T)
 [1] "jan" "feb" "mar" "apr" "may" "jun" "jul" "aug" "sep" "oct"
[11] "nov" "dec"
> gsub("^(\\w)","\\U\\1",tolower(temp),perl = T)
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct"
[11] "Nov" "Dec"

grep()可以用来搜索字符串,其次还有match()

> x = c("b","A+","AC")
> grep("b",x,fixed = T)
[1] 1

strsplit()可以用来分割字符串,返回一个列表,跟Python一个意思

> path = "/usr/local/bin/R"
> strsplit(path,"/")
[[1]]
[1] ""      "usr"   "local" "bin"   "R"  

后语:正则表达式是很重要的技能

附赠技能:随机字符串,比如生成一副扑克牌

> face = 1:13
> suit = c("spades","clubs","hearts","diamonds")

### FUN表示接一个函数,这里是连接函数,sep表示连接符号
> outer(suit,face,FUN = paste,sep="-")
     [,1]         [,2]         [,3]         [,4]        
[1,] "spades-1"   "spades-2"   "spades-3"   "spades-4"  
[2,] "clubs-1"    "clubs-2"    "clubs-3"    "clubs-4"   
[3,] "hearts-1"   "hearts-2"   "hearts-3"   "hearts-4"  
[4,] "diamonds-1" "diamonds-2" "diamonds-3" "diamonds-4"
     [,5]         [,6]         [,7]         [,8]        
[1,] "spades-5"   "spades-6"   "spades-7"   "spades-8"  
[2,] "clubs-5"    "clubs-6"    "clubs-7"    "clubs-8"   
[3,] "hearts-5"   "hearts-6"   "hearts-7"   "hearts-8"  
[4,] "diamonds-5" "diamonds-6" "diamonds-7" "diamonds-8"
     [,9]         [,10]         [,11]         [,12]        
[1,] "spades-9"   "spades-10"   "spades-11"   "spades-12"  
[2,] "clubs-9"    "clubs-10"    "clubs-11"    "clubs-12"   
[3,] "hearts-9"   "hearts-10"   "hearts-11"   "hearts-12"  
[4,] "diamonds-9" "diamonds-10" "diamonds-11" "diamonds-12"
     [,13]        
[1,] "spades-13"  
[2,] "clubs-13"   
[3,] "hearts-13"  
[4,] "diamonds-13"

26-日期和时间

主要两点:

  1. 对时间序列的描述;一段时间内发生了什么.
  2. 利用前面的结果预测,预测接下来要发生什么.

R包的分类中Task Views有很多的处理时间分析的包

airmiles内置数据集就是一个专门的Time Series:的时间数据集.

Sys.Date()可以显示现在的时间

格式化日期类型

> a = "2017-01-01"  ## 这是一个字符串类型
> as.Date(a,format = "%Y-%m-%d")
[1] "2017-01-01"
> class(as.Date(a,format = "%Y-%m-%d"))
[1] "Date"  ## 这是一个日期类型

更多格式化日期的参数可以查看?strftime

可以用seq()创建一个连续的时间序列,创建连续的时间点:

> seq(as.Date("2017-01-01"),as.Date("2017-07-05"),by=5)
 [1] "2017-01-01" "2017-01-06" "2017-01-11"
 [4] "2017-01-16" "2017-01-21" "2017-01-26"
 [7] "2017-01-31" "2017-02-05" "2017-02-10"
[10] "2017-02-15" "2017-02-20" "2017-02-25"
[13] "2017-03-02" "2017-03-07" "2017-03-12"
[16] "2017-03-17" "2017-03-22" "2017-03-27"
[19] "2017-04-01" "2017-04-06" "2017-04-11"
[22] "2017-04-16" "2017-04-21" "2017-04-26"
[25] "2017-05-01" "2017-05-06" "2017-05-11"
[28] "2017-05-16" "2017-05-21" "2017-05-26"
[31] "2017-05-31" "2017-06-05" "2017-06-10"
[34] "2017-06-15" "2017-06-20" "2017-06-25"
[37] "2017-06-30" "2017-07-05"

随机生成48个数字

介绍了ts函数

27-常见错误

问题:

  • 等号问题,复制操作,==表示判断是否相等
  • 赋值问题
  • c函数问题
  • 括号的问题
  • 引号问题,引号内的一边为字符
  • 安装包的时候要加引号install.packages("gclus")
  • 逗号问题,起一个分割作用
  • 在windows中路径/为R中的转义符
  • 包是需要载入的,
  • R中严格区分大小写

解决问题方法

  • google
  • Rblogger
  • quickR
  • stackoverflow等

28-获取数据

获取途径:

  • 利用键盘来输入数据;
  • 读取存储在外部的数据;
  • 通过访问数据框系统来获取数据;

前面的都不主流,主要是访问外部的文件,或者数据框的信息

通过ODBC 访问数据库,相当于数据库的一个驱动.
install.packages("RODBC")就可以安装了,但是我这里报错了

这里讲的不是很详细

29-读取文件(一)

R几乎可以读取所有的数据文件

setwd(dir)来设置工作目录;
在工作目录下x = read.table("input.txt")就可以读取文件了,这里只是读取到内存中.

> x = read.table("c:/Users/theing/Desktop/input.txt")  ## 这样也可以读取文件信息

> head(x)  ## 显示头部的信息
> tail(x,n=10)  ## 显示尾部的10行信息

> x = read.table("input.csv",sep=",")  ## 可以读取以","分割的csv文件
> x = read.csv("input.csv")  ## 这个一样的效果

read.table()的参数

  • skip=5 可以跳过前面的行,从第六行读取数据
  • nrows=100 这样可以只读取前面100行.可以和skip 配合使用
  • na.strings 处理缺失值,
  • stringsAsFactors=False 用来控制字符串是否转换成因子,R会默认的将字符串转换成因子.所以要设置成false

30-读取文件(二)

read.table 也可以读取网络连接

老师展示了很多被墙了的链接,估计也是在暗示着什么

其次还介绍了foreign包,

如何搜索R的相关包

> RSiteSearch("Matlab")
檢索查詢疑問已被提交给http://search.r-project.org
计算结果应很快就在瀏覽器里打开

读取剪切板的内容,

## 比如你在excel中复制了一部分内容,就可以用这个功能
## readCliboard() 就是读取剪切板的内容.

> x = read.table("clipboard",header = T,sep="\t")

读取一个压缩文本的文件,R也是可以直接读取的

> read.table(gzfile("input.txt.gz")

如果遇到不标准的文件格式,可以用readlinesscan

## 可以限制读入的行数
> readLines("input.csv",n=15)

> ?scan可以查看帮助

31-写入文件

基本就是使用write函数

> write(x,file = "x.txt")

可以用,基本和Python类似。

## sep 表示分隔符,row.name 表示行号
> write.table(x,file = "c:/sld/sdl/x.csv",sep = ",",row.name = FALSE)

直接写成压缩文件,比如

> write.table(mtcars,gzfile("newfile.txt.gz")

32-读取excel文件

excel也是一个很好的数据统计文件,大多时候别人都是excel,所以还是应该掌握处理excel的能力.

excel倒过来的时候用的csv格式

XLConnect包,excel包含工作簿和工作表,称为workbook,可以直接打开xlsx的文件, 注意这个包是需要安装java环境.个人觉得这个没必要,能用excel处理就用excel处理.

> ex = loadWorkbook("data.xlsx")
> readWorksheet(ex,1)  ## 1表示查看的第一个工作表
> ?readWorksheet  ##查看具体的功能介绍

编辑excel

分四步法

  • 用loadWorkbook创建一个工作簿
  • 工作簿中创建工作表
  • 用writeWorksheet工具把数据保存到工作表中
  • 用seveWorkbook保存为excel文件
    > wb = loadWorkbook("file.xlsx",create = T)
    > createSheet(wb,"Sheet 1")
    > wtiteWorksheet(wb,data=mtcars,sheet = "Sheet1")
    > seveWorkbook(wb)
    查看XLConnet的详细介绍
    vignette("XLConnect")

xlsx包的使用

## 读取第一个工作表的1到100行的内容,sheetName指明工作表的名称.append是否追加写入(新的文件,还是更改表格).
> library(xlsx)
> read.xlsx("data.xlsx",1,startRow = 1,endRow = 100)
> write.xlsx(x,file = "rdata.xlsx",sheetName = "Sheet 1",append = F)

33-读写R格式的文档

R有两种格式的文件,Rdata和RDS

RDS文件

> saveRDS(iris,file="iris.RDS")
> readRDS("iris.RDS")

Rdata 文件,项目文件,使用load()加载,一般双击就可以打开了.

## 示例
> load(".RData")
> save(iris,iris3,file = "c:/Users/theing/Desktop/iris.Rdata")

保存镜像

save.image()

34-数据转换

数据的收集和存储已经会了,这里开始数据的转换,转换后就可以分析数据了.

前面介绍是向量,矩阵,数组,数据框,列表,因子,时间序列,等的增删改查

> cars32 = read.csv("mtcars.csv")
> is.data.frame(cars32)
[1] TRUE  ## 表示是一个矩阵
> is.data.frame(state.x77)
[1] FALSE

转换为数据框

> dstate.x77 = as.data.frame(state.x77)

转换为矩阵,变为字符串类型的矩阵

> as.matrix(data.frame(state.region,state.x77))

methods查看内容

> methods(is)
> methods(as)

向量是R种基本的数据类型,加上一个维度就是数组或者矩阵

## > is.data.frame(state.x77)
[1] FALSE
> x = state.abb
> dim(x) = c(5,10)

## 向量变因子
> x = state.babb
> as.factor(x)

## 变为列表
> as.list(x)

添加一个数据框

> state = data.frame(x,state.region,state.x77)

35-数据转换(二)

讲一个取子集的操作

## 这是一个数据框
> who = read.csv("WHO.csv",header = T)
> who1 = who[c(1:50),c(1:10)]
> who2 = who[c(1,3,5,8),c(2,14,16)]

取出CountryID 在50到100的国家,似乎不知道怎么去理解

> who4 = who[which,(who$CountryID > 50 & who$CountryID <=100)]
> who4 = subset(who,who$CountryID > 50 & who$CountryID <=100)

sample抽样,机器学习中抽取两份样本,一份用来建模,一份用来验证模型的有效性

> ?sample
## 例子,第一个参数为是选择那个向量,第二个是要抽取的个数,replace 表示是否放回式的抽样.
> x = 1:100
> sample(x,30,replace = T)
 [1] 39 23 11 26 50 86 86 71 26  6 10 93 81 73 74 87 98
[18]  6 17 87 10 69 51 24 22 70 33 68 97 82
> sort(sample(x,30,replace = T))
 [1]  8 19 23 23 28 31 32 40 40 42 50 50 50 51 52 55 58
[18] 60 63 70 73 77 78 83 83 84 85 89 93 96

sample对数据框进行抽样,取子集

> who[sample(who$CountryID,30,replace = F),]

删除固定行的数据

## 注意逗号的位置
> mtcars[-1:-5,]

## 清空这一行的数据
> mtcars$mpg = NULL 

如果遇到几个数据表进行汇总,这里要用到数据框的合并,可以使用cbind和rbind函数,cbind添加一列,rbind添加一行.

cbind合并列

## USArrests是一个数据集,state.division是一个因子
> cbind(USArrests,state.division)

rbind合并行,这个比较麻烦,需要所有的列有源数据集有相同的列名

## 取出前20行和尾20行合并
> data1 = head(USArrests,20)
> data2 = head(USArrests,20)
> b = rbind(data1,data2)

cbind和rbind也可以用于矩阵

回顾rownames可以取出行名

判断向量和数据框中哪些是重复值

> duplicated(who)

用unique(data4)可以一步取出重复项

36-收据转换(三)

R中行列的调换,excel中可以复制后选择性粘贴.R中可以用t()函数实现转换

> sractm = t(mtcars)

单独一行的反转,生物序列中很常见,主要是反向互补,可以使用rev函,reverse的意思

> letters
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
[13] "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x"
[25] "y" "z"
> rev(letters)
 [1] "z" "y" "x" "w" "v" "u" "t" "s" "r" "q" "p" "o"
[13] "n" "m" "l" "k" "j" "i" "h" "g" "f" "e" "d" "c"
[25] "b" "a"

数据框中的数据反转,思路就是,提取行名,反转,以反转后的行名为索引

> rowname(women)

文章作者: theing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 theing !
评论
  目录