R语言实战之创建数据集

创建数据集

  • 选择一种数据结构来存储数据
  • 将数据输入或导入到这个数据结构中

数据集

由数据构成的一个矩形数组,行表示观测、记录(observation,record),列表示变量、字段(variable,field)。

向量

  • 函数c()用于创建向量
  • 向量是用于存储数值、字符串或逻辑数据的一维数组
  • 单个向量中的数据必须相同的类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
> a <- c(1,2,5,3,6,-2,4)
> b <- c("one","two","three")
> c <- c(TRUE,TRUE,FALSE,TRUE)
> a
[1] 1 2 5 3 6 -2 4
> b
[1] "one" "two" "three"
> c
[1] TRUE TRUE FALSE TRUE
> a[3]
[1] 5
> a[c(2,5)]
[1] 2 6
> a[2:5]
[1] 2 5 3 6
> c(2:5) # 冒号产生数值序列
[1] 2 3 4 5

矩阵

  • 函数matrix()创建矩阵
  • 矩阵是一个二维数组,每个元素类型必须相同,是数值、字符串或逻辑类型
  • dimnames是可选,包含了行名、列名
  • byrow是按行填充(byrow=TRUE),即先填充完一行再填充下一行,默认是按列填充(byrow=FALSE)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
> y <- matrix(1:20, nrow=5, ncol=4)
> y
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> cells <- c(1,26,24,68)
> rnames <- c("R1","R2")
> cnames <- c("C1","C2")
> mymatrix <- matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
> mymatrix
C1 C2
R1 1 26
R2 24 68
> mymatrix <- matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rnames,cnames))
> mymatrix
C1 C2
R1 1 24
R2 26 68

矩阵的访问类似向量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> x <- matrix(1:10,nrow=2)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> x[2,]
[1] 2 4 6 8 10
> x[,2]
[1] 3 4
> x[1,4]
[1] 7
> x[1,c(4,5)]
[1] 7 9

数组

  • 函数array()创建数组
  • 数组类似矩阵,但维度可以大于2
  • 数组元素类型必须相同,访问方式类似矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
> dim1 <- c("A1","A2")
> dim2 <- c("B1","B2","B3")
> dim3 <- c("C1","C2","C3","C4")
> z <- array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
> z[1,2,1]
[1] 3
> z[1,,1]
B1 B2 B3
1 3 5
> z[1,c(1,3),1]
B1 B3
1 5
> z[,,1]
B1 B2 B3
A1 1 3 5
A2 2 4 6
> z[1,c(1,3),c(1,4)]
C1 C4
B1 1 19
B3 5 23
> z[c(1,2),c(1,3),c(1,4)]
, , C1
B1 B3
A1 1 5
A2 2 6
, , C4
B1 B3
A1 19 23
A2 20 24

数据框

  • 函数data.frame()创建数据框
  • 数据框的列向量元素必须类型相同,但列向量之间可以是不同类型的元素
  • 每一列名字由函数names()定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
> patientID <- c(1,2,3,4)
> age <- c(25,34,28,52)
> diabetes <- c("Type1","Type2","Type1","Type1")
> status <- c("Poor","Improved","Excellent","Poor")
> patientdata <- data.frame(patientID,age, diabetes,status,row.names=patientID)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
> patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientdata[c("diabetes","status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
> patientdata$age # 符号$表示选定某个特定变量
[1] 25 34 28 52
> patientdata[c("age")]
age
1 25
2 34
3 28
4 52
> table(patientdata$diabetes, patientdata$status)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0

行名字:

1
2
3
4
5
6
7
8
9
10
11
12
> rownames(patientdata)
[1] "1" "2" "3" "4"
> rownames(patientdata) <- c("X","Y","Z","?")
> rownames(patientdata)
[1] "X" "Y" "Z" "?"
> patientdata
patientID age diabetes status
X 1 25 Type1 Poor
Y 2 34 Type2 Improved
Z 3 28 Type1 Excellent
? 4 52 Type1 Poor
  • 函数attach()将数据框添加到R搜索路径中
  • 函数detach()将数据框从R搜索路径中删除
  • 函数with()可以针对单独数据框执行,避免名字冲突导致的覆盖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> attach(patientdata)
The following objects are masked _by_ .GlobalEnv:
age, diabetes, patientID, status
> summary(age)
Min. 1st Qu. Median Mean 3rd Qu. Max.
25.00 27.25 31.00 34.75 38.50 52.00
> detach(patientdata)
> with(patientdata,{
+ summary(age)
+ })
Min. 1st Qu. Median Mean 3rd Qu. Max.
25.00 27.25 31.00 34.75 38.50 52.00
> with(patientdata,summary(age))
Min. 1st Qu. Median Mean 3rd Qu. Max.
25.00 27.25 31.00 34.75 38.50 52.00

在with内创建外部变量,用<<-赋值.

因子

  • 名义类型变量:没有顺序之分
  • 有序类型变量:表示顺序关系,而非数量关系
  • 连续类型变量:表示某个范围内的任意值,同时表示了数量和顺序
  • 名义类型变量和有序类型变量在R中叫因子(factor),决定了数据的分析方式和视觉呈现形式
  • 函数str(object):显示R中对象的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
> diabetes <- c("Type1","Type2","Type1","Type1")
> diabetes <- factor(diabetes)
> diabetes
[1] Type1 Type2 Type1 Type1
Levels: Type1 Type2
> status <- c("Poor","Improved","Excellent","Poor")
> status <- factor(status, ordered=TRUE) # 默认按字母排序
> status
[1] Poor Improved Excellent Poor
Levels: Excellent < Improved < Poor
> status <- factor(status, ordered=TRUE, levels=c("Poor","Improved","Excellent")) # 指定顺序
> status
[1] Poor Improved Excellent Poor
Levels: Poor < Improved < Excellent
> patientdata <- data.frame(patientID,age,diabetes,status)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
> str(patientdata)
'data.frame': 4 obs. of 4 variables:
$ patientID: num 1 2 3 4
$ age : num 25 34 28 52
$ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
$ status : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
> summary(patientdata)
patientID age diabetes status
Min. :1.00 Min. :25.00 Type1:3 Excellent:1
1st Qu.:1.75 1st Qu.:27.25 Type2:1 Improved :1
Median :2.50 Median :31.00 Poor :2
Mean :2.50 Mean :34.75
3rd Qu.:3.25 3rd Qu.:38.50
Max. :4.00 Max. :52.00

对因子统计了频率,对数值型统计了最大值、最小值、均值等。

列表

  • 函数list()创建列表
  • 列表可以是多个任意对象的组合
  • 以一种简单的方式组织和重新调用不相干的信息
  • 很多R函数返回的是列表,由分析人员决定取出哪些成分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
> g <- "My First List"
> h <- c(25,26,18,39)
> j <- matrix(1:10,nrow=5)
> k <- c("one","two","three")
> mylist <- list(title=g, ages=h,j,k)
> mylist
$title
[1] "My First List"
$ages
[1] 25 26 18 39
[[3] ]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4] ]
[1] "one" "two" "three"
> mylist[[2] ]
[1] 25 26 18 39
> mylist[["ages"] ]
[1] 25 26 18 39

数据输入

  • 函数edit():调用文本编辑器,对小数据集键盘输入比较实用
1
2
3
4
5
6
7
8
9
10
> mydata <- data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
> mydata <- edit(mydata)
Warning message:
In edit.data.frame(mydata) : 在'gender'里加上了因子水准
> mydata
age gender weight
1 1 you 10
2 2 me 20
  • 函数read.table(): 从带分隔符的文本文件中导入数据
1
> grades <- read.table("studentgrades.txt",header=TRUE, sep="\t",row.name="STUDENTID")
  • 导入Excel数据,使用软件包RODBCxlsx
  • 抓取网页数据,使用函数readLines()下载网页,然后使用grep()gsub()等处理
  • 访问数据库,也可通过软件包RODBCRJDBC

标注

  • 变量标签
  • 值标签
1
2
3
4
5
6
7
8
9
10
> names(patientdata)
[1] "patientID" "age" "diabetes" "status"
> names(patientdata)[2] <- "Age at hospitalization (in years)"
> names(patientdata)
[1] "patientID" "Age at hospitalization (in years)"
[3] "diabetes" "status"
> patientdata$gender <- factor(patientdata$gender,levels=c(1,2),labels=c("male","famale"))

常用数据处理函数

  • lenght(): 元素数量
  • dim(): 对象维度
  • str(): 对象结构
  • class(): 对象的类型
  • mode(): 对象的模式
  • names(): 对象各成分的名称
  • c(): 创建对象
  • cbind(): 按列合并对象
  • rbind(): 按行合并对象
  • Object: 输出对象
  • head(): 列出开头部分
  • tail(): 列出结尾部分
  • ls()
  • rm()
  • fix(object): 直接编辑对象
  • newobject <- edit(object): 编辑对象并另存为
吴羽舒 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!