数据结构
R语言的基础数据机构包括标量、向量、矩阵、数据框、因子、列表等,下面将逐一介绍
向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。向量一般由函数c()
生成,也可由其他函数生成。以下是常用的向量生成方法。
a <- c(1,2,-5,1,3,-10)
a ## 这行代码用于显示a
- 1
- 2
- -5
- 1
- 3
- -10
b <- c('Feb', 'July', "June", 'Oct') #单引号与双引号效果一样
c <- c(TRUE, FALSE, T, F) ## TRUE与T等效,同理,FALSE与F等效
d <- seq(from=1, to=10, by=2)
d
- 1
- 3
- 5
- 7
- 9
##seq() 常用来生成向量,如果想了解更多 seq()函数的细节,可以输入如下代码:
?seq
e <- seq(from=1, to=10, length.out=10)
e
length(e) ## 输出 向量e的长度
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
10
矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix创建矩阵。
y1 <- matrix(1:20, nrow=5, ncol=4)
y1
1 | 6 | 11 | 16 |
2 | 7 | 12 | 17 |
3 | 8 | 13 | 18 |
4 | 9 | 14 | 19 |
5 | 10 | 15 | 20 |
y2 <- matrix(1:20, nrow=5, ncol=4, byrow=T)
y2
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 |
y2[1,]
- 1
- 2
- 3
- 4
y2[2,]
- 5
- 6
- 7
- 8
数据框
数据框是进行数据分析时候,最常使用的一个数据格式。数据框的每一行表示一个样本,每一列表示一个特征。如下是一个典型的数据框。
data(mtcars)
head(mtcars)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
数据框的创建很简单,如下是一种简单的数据框创建方式:
id <- 1:5
status <- c("poor", "improved", "excellent", "poor", 'improved')
gender <- c('female', 'male', 'female', 'male', 'male')
df <- data.frame(id, status, gender)
df
id | status | gender |
---|---|---|
<int> | <chr> | <chr> |
1 | poor | female |
2 | improved | male |
3 | excellent | female |
4 | poor | male |
5 | improved | male |
选取数据框的某一类,可通过数据框名称$特征值名称的方式
df$id
- 1
- 2
- 3
- 4
- 5
对数据框进行初步分析,可采用如下方式:
summary(df)
id status gender
Min. :1 Length:5 Length:5
1st Qu.:2 Class :character Class :character
Median :3 Mode :character Mode :character
Mean :3
3rd Qu.:4
Max. :5
为数据框df增加一列,可采用如下操作:
a <- c(3,4,1,2,3)
df$b <- a
df$c <- a > 3
head(df)
id | status | gender | b | c | |
---|---|---|---|---|---|
<int> | <chr> | <chr> | <dbl> | <lgl> | |
1 | 1 | poor | female | 3 | FALSE |
2 | 2 | improved | male | 4 | TRUE |
3 | 3 | excellent | female | 1 | FALSE |
4 | 4 | poor | male | 2 | FALSE |
5 | 5 | improved | male | 3 | FALSE |
当然,更多时候,数据框不是通过输入获得,而是通过读取硬盘文件获得。关于读取文件,我们会在后面讲解。
因子
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1… k ](其中k 是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
因子分为无序因子和有序因子两类:
## 无序因子
type <- c('a', 'b', 'a', 'c', 'b') #字符串向量
type_f <- factor(type) #将向量type转换为无序因子
# type_f <- factor(type)将此向量存储为(1, 2, 1, 3, 1)
# 并在内部将其关联为 1=a,2=b,3=c(具体赋值根据字母顺序而定)
paste("type的类别是",class(type))
‘type的类别是 character’
- 'a'
- 'b'
- 'a'
- 'c'
- 'b'
paste("type_f的类别是",class(type_f))
str(type_f)
‘type_f的类别是 factor’
Factor w/ 3 levels "a","b","c": 1 2 1 3 2
## 有序因子
satisfaction <- c("dissatisfied", "satisfied", "neutral", "satisfied", "dissatisfied")
satisfaction_f <- factor(satisfaction, order=T,
levels = c("dissatisfied", "neutral", "satisfied" ))
str(satisfaction_f)
Ord.factor w/ 3 levels "dissatisfied"<..: 1 3 2 3 1
列表
列表(list)是一些对象的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个
列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表。
a <- "abcdefsds"
b <- 1:10
c <- matrix(1:20, nrow=2)
a_list <- list(a_string=a, a_vector=b, a_matrix=c)
a_list
-
$a_string
- 'abcdefsds' $a_vector
-
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
$a_matrix
-
A matrix: 2 × 10 of type int 1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20
str(a_list$a_string)
str(a_list$a_matrix)
chr "abcdefsds"
int [1:2, 1:10] 1 2 3 4 5 6 7 8 9 10 ...
数据的输入输出
一般情况下,我们较少从键盘上输入数据,更多的是从硬盘的文件中导入数据。经常使用的数据格式包括:csv,txt,xls,dta格式等。
df1 <- read.table("data1.csv", header=T, sep=",")
## header 用于表征每列是否有名称,sep用于表征数据与数据之间的分隔符,csv格式的分隔符是","
## 如果读取文件的路径不是R默认的路径,应该写入绝对路径:
## df1 <- read.table("D:/datafile/data1.csv", header=T, sep=",")
head(df1)
X | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
<chr> | <dbl> | <int> | <dbl> | <int> | <dbl> | <dbl> | <dbl> | <int> | <int> | <int> | <int> | |
1 | Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
2 | Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
3 | Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
4 | Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
5 | Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
6 | Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
##csv格式是最常用的保存数据的格式,excel中可以保存为csv格式,如果是csv格式,可以用更简单的函数导入数据
##write.csv中将分隔符设置为","
df2 <- read.csv("data1.csv", header=T)
head(df2)
X | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
<chr> | <dbl> | <int> | <dbl> | <int> | <dbl> | <dbl> | <dbl> | <int> | <int> | <int> | <int> | |
1 | Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
2 | Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
3 | Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
4 | Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
5 | Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
6 | Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
##写入数据与读取数据类似
write.table(df1, "data2.csv", sep=",")
write.csv(df1, "data3.csv")
## xls格式的导入
library(xlsx)
df3 <- read.xlsx("data2.xls",1)
head(df3)
mpg | cyl | disp | hp | drat | wt | |
---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
1 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 |
2 | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 |
3 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 |
4 | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 |
5 | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 |
6 | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 |
## xlsx格式的导入
df4 <- read.xlsx("data3.xlsx",2)
head(df4)
qsec | vs | am | gear | carb | |
---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
1 | 16.46 | 0 | 1 | 4 | 4 |
2 | 17.02 | 0 | 1 | 4 | 4 |
3 | 18.61 | 1 | 1 | 4 | 1 |
4 | 19.44 | 1 | 0 | 3 | 1 |
5 | 17.02 | 0 | 0 | 3 | 2 |
6 | 20.22 | 1 | 0 | 3 | 1 |