R语言实战(第2版)—— Chapter 02创建数据集
R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表
表2-1提供了一个假想的病例数据集
2.21 向量
# 创建向量
a <- c(1, 2, 5, 3, 6, -2, 4)
b <- c("one", "two", "three")
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
# 元素的访问
> a[3]
[1] 5
> a[c(2, 4)]
[1] 2 3
# 使用的冒号用于生成一个数值序列
# 例如a <- c(2:6)等价于a <- c(2,3, 4, 5, 6)
a <- c(2:6)
a
[1] 2 3 4 5 6
2.22 矩阵
# byrow则表明矩阵应当按行填充( byrow=TRUE)
# 还是按列填充( byrow=FALSE),默认情况下按列填充
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
#矩阵下标的使用
# 显示第二行
x[2,]
# 显示第二列
x[,2]
# 显示第一行第四列的数据
x[1,4]
# 显示第一行第四个和第五个数据
x[1, c(4,5)]
2.24 数据框
# 创建一个数据框,每一列数据的模式必须唯一
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)
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
数据框的增加和删除:
# 给数据框增加一列,如sex列:
> patientdata$sex <- c('male','male','female','female')
# 在数据框中删除某列,如gender列:
> patientdata <-subset(patientdata, select = -c(gender))
# 选取数据框中的元素
> patientdata[1:2] # 等价于 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
> patientdata$age
[1] 25 34 28 52
# 想生成糖尿病类型变量diabetes和病情变量status的列联表
> table(patientdata$diabetes, patientdata$status)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0
with的用法
# 花括号{}之间的语句都针对数据框mtcars执行
with(mtcars, {
print(summary(mpg))
plot(mpg, disp)
plot(mpg, wt)
})
2.2.5 因子
变量可归结为名义型、有序型或连续型变量。 名义型变量是没有顺序之分的类别变量。糖尿病类型Diabetes( Type1、 Type2)是名义型变量的一例。即使在数据中Type1编码为1而Type2编码为2,这也并不意味着二者是有序的。 有序型变量表示一种顺序关系,而非数量关系。病情Status( poor、 improved、 excellent)是顺序型变量的一个上佳示例。我们明白,病情为poor(较差)病人的状态不如improved(病情好转)的病人,但并不知道相差多少。连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。
类别(名义型)变量和有序类别(有序型)变量在R中称为因子( factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
举例来说,假设有向量:
diabetes <- c("Type1", "Type2", "Type1", "Type1")
语句diabetes <- factor(diabetes)将此向量存储为(1, 2, 1, 1),并在内部将其关联为1=Type1和2=Type2(具体赋值根据字母顺序而定)。针对向量diabetes进行的任何分析都会将其作为名义型变量对待,并自动选择适合这一测量尺度的统计方法。
要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。给定向量:status <- c("Poor", "Improved", "Excellent", "Poor")
语句status <- factor(status, ordered=TRUE)会将向量编码为(3, 2, 1, 3),并在内部
将这些值关联为1=Excellent、 2=Improved以及3=Poor。另外,针对此向量进行的任何分析都会将其作为有序型变量对待,并自动选择合适的统计方法。对于字符型向量,因子的水平默认依字母顺序创建。
但是按默认的字母顺序排序的因子很少能够让人满意。你可以通过指定levels选项来覆盖默认排序。各水平的赋值将为1=Poor、 2=Improved、 3=Excellent。例如:
status <- factor(status, order=TRUE,
levels=c("Poor", "Improved", "Excellent"))
数值型变量可用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句把变量转换成一个无序因子:
> sex <- c(1,2,1,1,2)
> sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))
> sex
[1] Male Female Male Male Female
Levels: Male Female
2.26 列表
# 创建一个列表
> g <- "My First List"
> h <- c(25, 26, 18, 39)
> j <- matrix(1:10, nrow=5)
> k <- c("one", "two", "three")
# 可以为列表中的对象命名,如title和ages
> 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[2]
$ages
[1] 25 26 18 39
> mylist[["ages"]]
[[1] 25 26 18 39
> mylist["ages"]
$ages
[1] 25 26 18 39
2.3.2 从带分隔符的文本文件(.csv)导入数据
考虑一个名为studentgrades.csv的文本文件,文件的前几行如下:
StudentID,First,Last,Math,Science,Social Studies
011,Bob,Smith,90,80,67
012,Jane,Weary,75,,80
010,Dan,"Thornton, III",65,75,70
040,Mary,"O'Leary",90,95,92
这个文件可以用以下语句来读入成一个数据框:
> grades <- read.table("studentgrades.csv", header=TRUE,
+ row.names="StudentID", sep=",")
> grades
First Last Math Science Social.Studies
11 Bob Smith 90 80 67
12 Jane Weary 75 NA 80
10 Dan "Thornton, III" 65 75 70
40 Mary "O'Leary" 90 95 92
默认地, read.table()把字符变量转化为因子,这并不一定都是我们想要的情况。比如说,很少情况下,我们才会把回答者的评论转化成为因子。你可用多种方法去掉这个行为。加上选项stringsAsFactors=FALSE对所有的字符变量都去掉这个行为。此外,你可以用colClasses
选项去对每一列都指定一个类(比如说,逻辑型、数值型、字符型或因子型)。
2.41 变量标签
考虑之前病例数据框的例子。名为age的第二列包含着个体首次入院时的年龄。代码:
> names(patientdata)[2] <- "Age at hospitalization (in years)"
将age重命名为"Age at hospitalization (in years)"。很明显,新的变量名太长,不适合重复输入。作为替代,你可以使用patientdata[2]来引用这个变量,而在本应输出age的地方输出字符串"Age at hospitalization (in years)"。很显然,这个方法并不理想,如果你能尝试想出更好的命名(例如, admissionAge)可能会更好一点。
2.4.2 值标签
函数factor()可为类别型变量创建值标签。继续上例,假设你有一个名为gender的变量,
其中1表示男性, 2表示女性。你可以使用代码:
> patientdata$gender <- factor(patientdata$gender,
> levels = c(1,2),
> labels = c("male", "female"))
来创建值标签。
这里levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。