with(mtcars, { nokeepstats <- summary(mpg) keepstats <<- summary(mpg)})nokeepstats 错误: 找不到对象'nokeepstats'keepstats Min. 1st Qu. Median Mean 3rd Qu. Max. 10.40 15.43 19.20 20.09 22.80 33.90实例标识符
病人编号(patientID)用于区分病例数据集中不同的个体。
实例标识符(case identifier)可通过数据框操作函数中的rowname选项指定。
patientdata<-data.frame(patientID, age, diabetes, status, row.names=patientID)
将patientID指定为R中标记各类打印输出和图形中实例名称所用的变量。
6. 因子
变量可归结为名义型、有序型或连续型变量。
名义型变量是没有顺序之分的类别变量
有序型变量表示一种顺序关系,而非数量关系
连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。
函数factor()以一个整数向量的形式存储类别值,同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
类别(名义型)变量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选项来覆盖默认排序。
status <- factor(status, order=TRUE, levels=c("Poor", "Improved", "Excellent"))
各水平的赋值将为1=Poor、2=Improved、3=Excellent,任何在数据中出现而未在参数中列举的数据都将被设为缺失值。
数值型变量
可以用levels和labels参数来编码成因子。
例:如果男性被编码成1,女性被编码成2
sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))
将变量转换成一个无序因子,性别将被当成类别型变量,标签“Male”和“Female”将替代1和2在结果中输出。
因子的使用:
#以向量形式输入数据patientID <- c(1, 2, 3, 4)age <- c(25, 34, 28, 52)diabetes <- c("Type1", "Type2", "Type1", "Type1")status <- c("Poor", "Improved", "Excellent", "Poor")#指定为一个普通因子diabetes <- factor(diabetes) #指定为一个有序型因子status <- factor(status, order=TRUE) patientdata <- data.frame(patientID, age, diabetes, status
#显示对象的结构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
diabetes是一个因子;status是一个有序型因子。
#显示对象的统计概要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
函数summary()会区别对待各个变量:
显示连续型变量age的最小值、最大值、均值和各四分位数;
显示类别型变量diabetes和status(各水平)的频数值。
7. 列表
列表(list)是一些对象(或成分,component)的有序集合,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。
使用函数list()创建列表:
mylist <- list(object1, object2, ...)
可以为列表中的对象命名:
mylist <- list(name1=object1, name2=object2, ...)
创建一个列表:
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 39mylist[["ages"]][1] 25 26 18 39
双重方括号中指明代表某个成分的数字或名称访问列表中的元素。
注意事项
对象名称中的句点(.)没有特殊意义
R中用美元符号($)指定一个数据框或列表中的某些部分。
将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值。
x <- c(8, 6, 4)x[7] <- 10x #通过赋值,向量x由三个元素扩展到了七个元素[1] 8 6 4 NA NA NA 10
x <- x[1:3] #重新将其缩减回三个元素x [1] 8 6 4
R中没有标量。标量以单元素向量的形式出现。
R中的下标不从0开始,而从1开始。在上述向量中,x[1]的值为8。
变量无法被声明。它们在首次被赋值时生成。
2.2 数据输入
1. 键盘输入数据文本编辑器
edit()会自动调用一个允许手动输入数据的文本编辑器。
mydata <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0))edit(mydata) #通过图2-1所示文本编辑器输入数据,但结果并未保存 age gender weight 1 25 m 166 2 30 f 115 3 18 f 120 Warning message: In edit.data.frame(mydata) : 在'gender'里加上了因子水准
图2-1 通过文本编辑器输入数据
mydata <- edit(mydata) #编辑的结果需要赋值回对象本身,结果保存在mydata中mydata age gender weight 1 25 m 166 2 30 f 115 3 18 f 120
语句 mydata<-edit(mydata)的一种等价写法是 fix(mydata)。
直接嵌入数据集mydatatxt <- " age gender weight 25 m 166 30 f 115 18 f 120 "mydata <- read.table(header=TRUE, text=mydatatxt) #read.table()函数被用于处理字符串并返回数据框
键盘输入数据的方式常用于处理小数据集。对于较大的数据集,可以从现有的文本文件、Excel电子表格、统计软件或数据库中导入数据。
2. 从带分隔符的文本文件导入数据
可以使用read.table()从带分隔符的文本文件中导入数据。其语法如下:
mydataframe<-read.table(file,options)
file是一个带分隔符的ASCII文本文件
options是控制如何处理数据的选项
表2-1 函数read.table()的选项
选项描述header一个表示文件是否在第一行包含了变量名的逻辑型变量sep
分开数据值的分隔符
默认是 sep="",这表示了一个或多个空格、制表符、换行或回车 sep=","读取用逗号来分隔行内数据的文件
sep=" "读取使用制表符来分割行内数据的文件
row.names一个用于指定一个或多个行标记符的可选参数col.names如果数据文件的第一行不包括变量名(header=FASLE),可以用 col.names 去指定一个包含变量名的字符向量colClasses可以对每一列都指定一个类(比如说,逻辑型、数值型、字符型或因子型)
例:用逗号分隔的文本文件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
setwd("~/目标文件所在文件夹") #定位到目标文件所在文件夹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
str(grades) 'data.frame': 4 obs. of 5 variables: $ First : Factor w/ 4 levels "Bob","Dan","Jane",..: 1 3 2 4 $ Last : Factor w/ 4 levels "O'Leary","Smith",..: 2 4 3 1 $ Math : int 90 75 65 90 $ Science : int 80 NA 75 95 $ Social.Studies: int 67 80 70 92
注意:
列StudentID现在是行名,不再有标签,也失去了前置的0
Dan的姓左右使用引号,避免Thornton和III之间的空格
O’Leary左右使用引号,否则R会把单引号读取为分隔符
默认地,read.table()把字符变量转化为因子,可以加上选项stringsAsFactors=FALSE避免出现这种情况
可以用colClasses 选项去对每一列都指定一个类
grades <- read.table("studentgrades.csv", header=TRUE, row.names="StudentID", sep=",", colClasses=c("character", "character", "character", "numeric", "numeric", "numeric"))grades First Last Math Science Social.Studies 011 Bob Smith 90 80 67 012 Jane Weary 75 NA 80 010 Dan Thornton, III 65 75 70 040 Mary O'Leary 90 95 92
str(grades) 'data.frame': 4 obs. of 5 variables: $ First : chr "Bob" "Jane" "Dan" "Mary" $ Last : chr "Smith" "Weary" "Thornton, III" "O'Leary" $ Math : num 90 75 65 90 $ Science : num 80 NA 75 95 $ Social.Studies: num 67 80 70 92
行名保留了前缀0,而且First和Last不再是因子;grades作为实数而不是整数来进行排序。
可以用同样的方法打开txt格式的文本文件。
3. 导入Excel数据可以在Excel中将其导出为一个逗号分隔文件(csv),并使用前文描述的方式将其导入R中。可以用xlsx包直接导入
首先需要安装xlsx包,xlsxjars和rJava包,以及一个正常工作的Java 安装(http://java.com)。
函数read.xlsx()导入一个工作表到一个数据框中。格式是:
read.xlsx(file,n)
1. file是Excel工作簿的所在路径
2. n则为要导入的工作表序号
例:从目标文件夹的studentgrades.xlsx中导入了第一个工作表,并将其保存为一个数据框mydataframe。
library(xlsx)workbook <- "目标文件夹/studentgrades.xlsx"mydataframe <- read.xlsx(workbook, 1)
R还可以从流行的统计软件、特殊格式的文件、多种关系型数据库管理系统、专业数据库、网站和在线服务中导入数据。具体方法可参见原书。
2.3 数据集的标注
1. 变量标签——为变量名添加描述性的标签
可以将变量标签作为变量名,然后通过位置下标来访问这个变量。
names(patientdata)[2] <- "Age at hospitalization (in years)"patientdata patientID Age at hospitalization (in years) diabetes status 1 1 25 Type1 Poor 2 2 34 Type2 Improved 3 3 28 Type1 Excellent 4 4 52 Type1 Poor
新的变量名太长,不适合重复输入,可以使用patientdata[2]来引用这个变量。
patientdata[2] Age at hospitalization (in years) 1 25 2 34 3 28 4 522. 值标签——为类别型变量中的编码添加值标签
函数factor()可为类别型变量创建值标签。
patientdata$gender <- factor(patientdata$gender, levels = c(1,2), labels = c("male", "female"))
levels代表变量的实际值
labels表示包含了理想值标签的字符型向量
2.4 处理数据对象的实用函数
表2-2 处理数据对象的实用函数
函数用途length(object)显示对象中元素/成分的数量dim(object)显示某个对象的维度str(object)显示某个对象的结构class(object)显示某个对象的类或类型mode(object)显示某个对象的模式names(object)显示某对象中各成分的名称c(object, object,...)将对象合并入一个向量cbind(object, object, ...)按列合并对象rbind(object, object, ...)按行合并对象object输出某个对象head(object)列出某个对象的开始部分tail(object)列出某个对象的最后部分ls()显示当前的对象列表rm(object, object, ...)删除一个或更多个对象语句 rm(list = ls())将删除当前工作环境中的几乎所有对象newobject<- edit(object)编辑对象并另存为 newobjectfix(object)直接编辑对象