文章和代码曾经归档至【Github 仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复 R 语言 也可获取。
任何数据分析的第一步都是依照所须要的格局创立数据集。在 R 中,这个工作包含两个步骤:首先抉择一种数据结构来存储数据,而后将数据输出或者导入这个数据结构中。上面介绍 R 中用于存储数据的多种数据结构。
R 的数据结构
- 在大多数状况下,结构化的数据是一个由很多行和很多列组成的数据集。在 R 中,这种数据集被称为 数据框。
- 在学习数据框之前,咱们先来意识一些用于存储数据的数据结构:向量、因子、矩阵、数组和列表。
1.1 向量
向量(vector)是用于存储数值型、字符型、逻辑型数据的一维数组。标量能够看作是只含有一个元素的向量。函数 c()
可用来创立向量,例如:
x1 <- c(2, 4, 1, -2, 5)
x2 <- c("one", "two", "three")
x3 <- c(TRUE, FALSE, TRUE, FALSE)
这里 x1 是数值型向量,x2 是字符型向量,而 x3 是逻辑型向量。每一个向量中的数据类型必须统一。如果想创立有法则的向量,R 提供了一些简便的操作和函数,例如:
x4 <- 1:5 # 等价于 x4 <- c(1, 2, 3, 4, 5)
x5 <- seq(from = 2, to = 10, by = 2) # 等价于 x5 <- c(2, 4, 6, 8, 10)
x6 <- rep("a", times = 4) # 等价于 x6 <- c("a", "a", "a", "a")
有时候咱们只想应用向量中的某个局部,即 选取向量的子集。假如有一个从 3 到 100 的步长为 7 的整数向量,那么第 5 个数的值是多少呢?
x <- seq(from = 3, to = 100, by = 7)
# 显示第 5 个元素
x[5]
# 显示第 4,6,7 个元素
x[c(4, 6, 7)]
在方括号“[]”中的数字被称为 下标
,它指定向量的索引地位。在下面的命令里,x[5] 示意向量的第 5 个元素,其值为 31。
下标中的向量能够取负值,示意去除指定地位上的元素。例如,要去掉 x 的前 4 个元素,能够输出上面的代码(留神命令里的括号):
x[-(1:4)]
R 中的运算都是向量化的,例如:
weight <- c(68, 72, 57, 90, 65, 52)
height <- c(1.75, 1.80, 1.65, 1.90, 1.72, 1.65)
bmi <- weight / height ^ 2
bmi
在下面计算 bmi 的过程中,运算符“^”被循环应用了,所以计算的后果依然是一个向量。如果参加运算的向量的长度不统一,R 会主动补全后计算,补全的规定是循环短的向量,同时给出正告信息。
a <- 1:5
b <- 1:3
a + b
# Warning message in a + b:
#“longer object length is not a multiple of shorter object length”# 2 4 6 5 7
罕用的统计函数
函数 | 形容 |
---|---|
length(x) | 求 x 中元素的个数 |
mean(x) | 求 x 的算术平均值 |
median(x) | 求 x 的中位数 |
var(x) | 求 x 的样本方差 |
sd(x) | 求 x 的样本标准差 |
range(x) | 求 x 的全距 |
min(x) | 求 x 的最小值 |
max(x) | 求 x 的最大值 |
quantile(x) | 求 x 的分位数 |
sum(x) | 求 x 中所有元素的和 |
scale(x) | 将 x 标准化 |
1.2 因子
一般来说,变量有数值型、名义型和有序型之分。
名义型变量是没有程序关系的分类变量 ,例如人的性别、血型、民族等。而 有序型变量是有层级和程序关系的分类变量 ,如患者的病情(较差、恶化、很好)。 名义型变量和有序型变量在 R 中称为因子(factor)。
因子在 R 中十分重要,它决定了数据的展现和剖析形式。数据存储时因子常常以整数向量模式存储。所以在进行数据分析之前,常常须要将它们用函数 factor()
转换为因子。
# 先定义了一个变量 sex 示意性别,假如其取值 1 示意男性,2 示意女性。sex <- c(1, 2, 1, 1, 2, 1, 2)
# 接着用函数 factor( ) 将变量 sex 转换成了因子并存为对象 sex.f,其中参数 levels 示意原变量的分类标签值,参数 labels 示意因子取值的标签。sex.f <- factor(sex,
levels = c(1, 2),
labels = c("Male", "Female"))
sex.f
# ============ 输入 =============
# Male Female Male Male Female Male Female
# **Levels**:
# 'Male''Female'
留神,这两个参数在赋值时须要一一对应,R 会将它们相关联。因子型变量与个别的字符型变量的区别就是它有一个程度(level)属性。因子的属性能够应用函数 levels()
查看:
levels(sex.f)
# 'Male''Female'
扭转因子程度的排列程序 → 扭转参考组
在统计模型中,对于因子型变量,R 会将其第一个程度当作参考组。很多时候咱们须要扭转因子程度的排列程序以扭转参考组,这能够通过两种办法实现。第一种办法是在函数 factor() 中扭转参数 levels 和 labels 的排列程序,例如:
sex.f1 <- factor(sex, levels = c(2, 1), labels = c("Female", "Male"))
sex.f1
# Male Female Male Male Female Male Female
# **Levels**:
# 'Female' 'Male'
第二种办法是应用函数 relevel()
:
sex.f1 <- relevel(sex.f, ref = "Female")
sex.f1
# Male Female Male Male Female Male Female
# **Levels**:
# 'Female' 'Male'
序因子:ordered = TRUE
要示意有序因子,须要在函数 factor () 里 指定参数 ordered = TRUE。例如:
status <- c(1, 2, 2, 3, 1, 2, 2)
status.f <- factor(
status,
levels = c(1, 2, 3),
labels = c("Poor", "Improved", "Excellent"),
ordered = TRUE
)
status.f
# PoorImprovedImprovedExcellentPoorImprovedImproved
1.3 矩阵
矩阵(matrix)是一个由行和列组成的二维数组。矩阵里的每个元素具备雷同的模式(数值型、字符型或逻辑型)。在大多数状况下,矩阵里的元素是数值型的,它具备很多数学个性和运算形式,能够用来进行统计计算,例如因子分析、狭义线性模型等。
1.3.1 创立:matrix()
函数 matrix()
罕用于创立矩阵,例如:
M <- matrix(1:6, nrow = 2)
M
R 会依据向量的长度和参数 nrow 设定的行数主动计算列数。参数 byrow 默认为 FALSE,即按列将数值进行排列,如果须要 按行排列,只需将参数 byrow 设为 TRUE。
常见的矩阵运算都能够在 R 中实现,如矩阵加法、矩阵乘法、求逆矩阵、矩阵转置、求方阵的行列式、求方阵的特征值和特征向量等。
1.3.2 相乘:%*%
矩阵乘法中要求 第一个矩阵的列数等于第二个矩阵的行数,其运算符为 %*%
。
先创立两个矩阵:
mat1 <- matrix(1:6, nrow = 3)
mat1
mat2 <- matrix(5:10, nrow = 2)
mat2
# 函数 dim( )能够失去矩阵的维数,即行数和列数
dim(mat1)
# 32
dim(mat2)
# 23
mat1 %*% mat2
1.3.3 转置:t()
矩阵的转置运算就是把矩阵的行和列调换。例如,求矩阵 mat1 的转置矩阵:
t(mat1)
1.3.4 行列式和逆矩阵:det()、solve()
求方阵的 行列式 和逆矩阵 别离能够应用函数 det()
和函数 solve()
实现,例如:
mat3 <- matrix(1:4, nrow = 2)
det(mat3)
# -2
1.3.5 按行、列求和或者求均匀:rowSums、colSums、rowMeans、ColMeans
例如:
rowSums(mat1)
colSums(mat1)
rowMeans(mat1)
colMeans(mat1)
1.4 数组
通常所说的数组(array)指的是多维数组,它与矩阵相似,然而 维数大于 2。数组有一个非凡的维数(dim)属性。
上面的命令给一个向量加上维数后定义了一个数组,请留神数值的排列程序。
因为 notebook 上显示的数组不太美妙,倡议应用
print()
。以下代码在显示数组时会额定加上 print()。
A <- 1:24
dim(A) <- c(3, 4, 2)
# A # notebook 上数组显示不太失常,应用 print() 能够解决
print(A)
下面的数组还能够通过函数 array()
创立,并给各个维度增加名称和标签。
dim1 <- c("A1", "A2", "A3")
dim2 <- c("B1", "B2", "B3", "B4")
dim3 <- c("C1", "C2")
print(array(1:24, dim = c(3, 4, 2), dimnames = list(dim1, dim2, dim3)))
1.5 列表
列表(list)是 R 中最灵便也最简单的一种数据结构,它能够由不同类型的对象混合组成。例如,它 能够是向量、数组、表格和任意类型对象的组合。
list1 <- list(a = 1, b = 1:5, c = c("red", "blue", "green"))
list1
# $a
# 1
# $b
# 1 2 3 4 5
# $c
# 'red''blue''green'
在一般的数据分析中,创立列表并不是一项常见的工作。很多函数的返回值是一个列表。例如:
# 为了使后果具备可重复性,咱们在该命令前用函数 set.seed( ) 设置了生成随机数的种子。如果不设定种子,每次显示的后果很可能不同。set.seed(123)
# 用函数 rnorm( ) 从规范正态分布中生成了一个由 10 个数组成的随机样本。dat <- rnorm(10)
# 用函数 boxplot( ) 对这个随机样本作 ** 箱线图 **,并把后果保留为 bp。bp <- boxplot(dat)
# 函数 class( ) 用于查看对象的类型,这里 bp 是一个列表。class(bp)
# 'list'
查看这个列表外面的内容:
这里列表 bp 蕴含了多个对象,如果想查看或应用某一个对象,只需用“$
”符号援用。例如,要查看列表 bp 中的对象 stats 的内容,能够输出 bp$stats
。对列表中其余对象感兴趣,请移步 boxplot.stats
的阐明文档。
1.6 数据框
数据框(dataframe)是一个由行和列组成的二维构造,其中行示意观测(observation)或记录(record),列示意变量(variable)或指标(indicator)。数据框与 Excel、SAS 和 SPSS 中的数据集相似。数据框看起来与矩阵很类似,而且矩阵的很多操作也实用于数据框,如子集的抉择。
与矩阵不同的是,数据框里不同的列能够是不同模式(数值型、字符型等)的数据。数据框能够通过函数 data.frame() 创立。例如,上面的代码创立了一个蕴含 5 个观测对象、4 个变量的数据框:
ID <- 1:5
sex <- c("male", "female", "male", "female", "male")
age <- c(25, 34, 38, 28, 52)
pain <- c(1, 3, 2, 2, 3)
pain.f <- factor(pain, levels = 1:3, labels = c("mild", "medium", "severe"))
patients <- data.frame(ID, sex, age, pain.f)
patients
数据框实质上也是一种列表,要显示或应用数据框的某一变量(列),能够应用 $
符号加上变量名。例如:
patients$age
mean(patients$age)
大部分结构化的医学数据集均以数据框的模式出现,因而,数据框是最常解决的数据结构。
数据类型的转换:is.、as.
在进行数据分析时,剖析者须要对数据的类型熟稔于心,因为数据分析办法的抉择与数据的类型是有密切联系的。R 提供了一系列用于判断某个对象的数据类型的函数,还提供了将某种数据类型转换为另一种数据类型的函数。这些函数都存在于根本包 base 里,上面列出了其中的一部分罕用函数:
数据类型的判断与转换函数
判断 | 转换 |
---|---|
is.numeric() | as.numeric() |
is.character() | as.character() |
is.logical() | as.logical() |
is.factor() | as.factor() |
is.vector() | as.vector() |
is.matrix() | as.matrix() |
is.array() | as.array() |
is.data.frame() | as.data.frame() |
is.list() | as.list() |
is.table() | as.table() |
以 is.
结尾的函数的返回值为 TRUE 或 FALSE,而以 as.
结尾的函数将对象转换为相应的类型。例如:
x <- c(2, 5, 8)
is.numeric(x)
# TRUE
is.vector(x)
# TRUE
y <- as.character(x)
y
# '2''5''8'
is.numeric(y)
# FALSE
is.character(y)
# TRUE
z <- c(TRUE, FALSE, TRUE, FALSE)
is.logical(z)
# TRUE
as.numeric(z)
# 1 0 1 0
参考:赵军《R 语言医学数据分析实战》