好奇心是强劲的智慧的最永久的特性之一。by山·约翰逊
今天走的是清凉夏日风~~~
数据集:由数据构成的矩形数组,行表示观测,列表示变量(观测-变量;记录-字段;示例-属性)
R中的数据结构:标量,向量,数组,数据框,列表;
R中的数据类型:数值,字符,逻辑,复数,原生(字节)(数据类型和数据结构要分清)
实例标识符,日期数据,名义型和有序性变量;R将实例标识符称为rowname,将类别型变量称为因子。(看起来,实例标识符的意思就是行名,应该对应MySQL中的键)
R中的数据结构包括标量,向量,矩阵,数组,数据框,列表;
数据框:列表示变量,行表示观测,是用来存储数据集的主要数据结构;
因子(factor)是名义型变量或有序型变量。
矩阵和数据框的区别,可能在于矩阵中的数据都是同一种类型,而数据框中的数据各列可以是不同类型。
向量:
存储数值型,字符型,逻辑型数据的一位数组,可以用c()创建。单个向量中的数据必须是相同类型的;
访问向量中元素的方法:
a[c(2,4)]
a[3]
a[c(1,3,5)]
a[2:6]
冒号的用法:a-c(2:6)等价于a-c(2,3,4,5,6)(其实不加c()也行啊,就直接写a-2:6)
矩阵:
二维数组,元素拥有相同模式(数值型,字符型,逻辑型),用matrix创建。
mymatrix-matrix(vector,nrow=number_of_row,ncol=number_of_columns,byrow=logical_value,dimnames=list(rownames,colnames))将一个向量(第一个参数vector)转换成矩阵,nrow指定行数,ncol指定列数,byrowTRUE或FALSE确定是按行排列还是按列排列(默认按列),dimnames指定行名和列名,行名和列名分别用向量表示。举例(Ctrl+L可以清屏):如下图所示:创建矩阵所用元素为向量cells中的元素。创建的是2x2的矩阵,按行排列元素。行名、列名已提前在向量rnmes和cnmes中规定好了,用的时候将两个向量变成一个list赋值给dimnames。(/04/:08矩阵从向量来。指定行名列名要用列表)
矩阵的创建
矩阵中元素的引用:
x[2,]第二行
x[,2]第二列
x[1,4]第一行第四列的元素
x[1,c(4,5)]第一行,第四第五个元素
维度超过2时,使用数组(这个后面用得很少啊...是因为维度很少超过2吗?);有多种模式的数据时,使用数据框。
/03/:40数组
数组用array函数创建:myarray-array(vector,dimensions,dimnames),其中第二个参数dimensions是维度,是一个数值型向量;第三个参数dimnames是各维的名字,是个列表。举个栗子:
列表的创建
注意dimnames是个关键词。维度用c()函数做成向量,各维名称用list做成列表。
数组是矩阵的推广,其中的元素只能是一种模式。取元素方式与矩阵相同,如Z[1,2,5],第一个矩阵第二行第五列。
数据框
数据框可通过函数data.frame()创建:mydataframe-data.frame(col1,col2,col3,...);每一列的名称可由names函数指定。再举个栗子:
数据框的创建
可以看到,数据框,就是把几个向量用data.frame()函数结合到了一起。注意产生的数据框已经自动加上了列名,列名即是结合的向量的名字。每一列只能有一种数据模式,但是不同列的数据模式可以不一样。
数据框中元素的选择,可以用下标记号,也可以用列名,如patientdata[1:2],选了数据框第一列和第二列;而patientdata[1,2]选的是第一行第二列的元素;要选第一行第二行怎么办呢?那就是patientdata[1:2,]。注意没有逗号的时候默认是选择的列。(/04/:20以后用的时候把逗号都加上吧。)
当然也可以使用列名来选取元素:patientdata[c("diabetes","status")]。
还有一种新的表示方法:patientdata$age,选取数据框patientdata中age这一列。
上述描述的例子如下图所示:
从数据框中选取元素
生成两个变量的列联表(注意这个列联表和统计中的列联表是一个意思,就是符合条件的个体数),可以这样写:table(patientdata$disbetes,patientdata$status),table()函数生成两个参数的列联表,得到符合两个条件交叉的个体数量。如下图所示:
从数据框中生成列联表
attach(),detach(),with()
attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名后,将检查搜索路径中的数据框,以定位到这个变量。举个栗子:
summary(mtcars$mpg)(生成四分位数及均值)
plot(mtcars$mpg,mtcars$disp)
plot(mtcars$mpg,mtcars$wt)等价于下列代码:
attach(mtcars)
summary(mpg)
plot(mpg,disp)
plot(mpg,wt)
detach(mtcars)注意用完后别忘再把变量从搜索路径中请出来,以免后面有麻烦。
如果数据框中的变量与数据框外的变量同名,则attach(dataframe)会把数据框外的变量保留下来放在数据框中,即原有对象优先(而不是覆盖)。注意这一点,有点反逻辑。
上面的栗子用with()函数改写如下:(/04/:27模式:with(dataset,{statements}))
with(mtcars,{
summary(mpg,disp,wt)
plot(mpg,disp)
plot(mpg,wt)
})大括号之间的语句都针对数据框mtcars执行。大括号内赋值的变量,仅在大括号内有效。如果要让大括号内赋值的变量在大括号外有效的话,需要使用-这个符号赋值。
指定实例标识符:
在创建数据框时指定:patientdata-data.frame(patientID,age,diabetes,status,row.names=patientID)实例标识符(/04/:28这里的实例标识符相当于MySQL中的key吧?),看起来就类似于SQL中的键(注意,书上写错了,这里一定要是row.names。如果用其他的,不会报错,但是会创建一个新列列名就是等号左边的字符。如图所示)
在创建数据框时用"row.names=patientID"指定实例标识符。注意一定要是row.names。另外其他写法会增加一列。
因子:其实就是定类和定序类型的变量(也就是分类变量)。
函数factor()以一个整数向量的形式存储类别值,取值范围是[1-k],k是变量中唯一值的个数。
举个栗子:
diabetes-c("Type1","Type2","Type1","Type1")
diabetes-factor(diabetes)将此向量存储为(1,2,1,1),并在内部关联1=Type1,2=Type2(注意了注意了!复制顺序是根据字母顺序定的!)
(上面说的只是factor的工作原理。实际上得到的因子化的变量的值和没有因子化的变量的值是一样的,只是类型变了,也就是说R对待它们的方式变了。对于人来说,看到的内容是一样的)
有序变量的话,需要加ordered=TRUE选项。
再举个栗子:
status-c("Poor","Improved","Excellent","Poor")
status-factor(status,ordered=TRUE)
注意了注意了!!这里ordered=TURE只是告诉R,这个变量是个等级变量,但是没有规定等级的顺序!等级顺序是默认按字母顺序排列的。要想按照自己想要的顺序排列,需要使用levels选项:status-factor(status,ordered=TRUE,levels=c("Poor","Improved","Excellent"))在数据中出现而在这里levels中没有列举的元素,将全部被视为缺失值。
举个大栗子:
因子的使用
如图中所示,大部分内容都在前面提到过了。str(object)可提供R中某个对象的信息(/04/:13注意这里的str是structure,不是string);信息显示diabetes是个factor,而status是个Ord.factor。在summary返回的信息中,不同类型的变量得到了不同的处理,这就是指定因子的意义所在。
列表:
用list()创建列表:mylist-list(object1,object2,...)
还可以为列表中的每个对象取名字:mylist-list(name1=object1,name2=object2,...)
举个大栗子:
列表的创建与列表元素的获取
如图中所示,列表的创建如上所说,没啥可再说的。列表元素的获取可以通过两种方式进行:一是索引号,二是题目。不管索引号还是题目都放在双方括号中(/04/:15访问列表元素要用双方括号来索引),题目需要用双引号围起来。题目的使用不影响索引号,比如列表中的第二个元素,虽然加了ages这个题目,但是索引号依然是2。(/04/:16再再再次说明R中的list很像python中的字典)
一些注意事项:
R中没有多行注释,每行前面都要加#。但是可以用if(FALSE){...}这样的方式来使大括号内的语句不执行。(所有的语言都可以这么搞吧?)
如果赋值位置超过了索引号,变量将自动扩展以容纳新值。如下图所示:x只有3个元素,当要给x的第七个元素赋值时,R自动将x中元素数扩展到7,多出来的元素用NA补齐。注意R中元素索引是从1开始而不是从0开始
赋值范围超过了变量范围
R中没有标量,标量以单元素向量的形式出现;
数据的输入:
使用键盘输入数据:
创建一个空的数据框:mydata-data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
编辑数据:mydata-edit(mydata)出现如图所示的界面,即可编辑数据(/04/:19注意先要创建一个空的数据框,然后再edit)。注意要赋值。edit()实际上是在副本上操作。
age=numeric(0)这个语句将创建一个指定模式但不含实际数据的变量
使用键盘输入数据
mydata-edit(mydata)等价于fix(mydata)注意使用fix()就不用赋值了。
从带分隔符的文本文件(比如CSV?)导入数据
mydataframe-read.table("file",header=logical_value,sep="delimiter",row.names="name")
file是ASCII文本文件,row.names用于指定表示行标识符的变量(/04/:21就是行名)。注意row.names指定某一变量为记录的键。
默认情况下,字符型变量将被转换为因子。设置选项stringsAsFactors=FALSE即可停止转换(有何必要停止这种转换?)。另外可以使用colClasses为每一列指定一个类。
函数file(),gzfile(),bzfile(),xzfile(),unz(),url()可作为文件名参数使用;用双引号围住的完整的URL也可以作为文件名参数使用。
导入Excel数据
另存为csv再用上面的方法导入;
用RODBC包来访问Excel文件:
install.packages("RODBC")
library(RODBC)
channel-odbcConnectExcel("myfile.xls")channel应该是个文件句柄。通过文件句柄访问。
mydataframe-sqlFetch(channel,"mysheet")mysheet是文件中的一个工作表。从文件句柄中获取一个工作表,赋值给mydataframe
odbcClose(channel)关闭文件句柄。
xlsx文件本质上是多个XML文件组成的压缩包。xlsx包可以用来读取这种类型的文件
library(xlsx)
workbook-"c:/myworkbook.xlsx"把字符串赋值给workbook
mydataframe-read.xlsx(workbook,1)打开c:/myworkbook.xlsx这个文件的第一个工作表,赋值给一个数据框。是的,read.xlsx()函数返回一个数据框。
(好难记啊...现用现查吧...)
导入SPSS中的数据:
install.packages("Hmisc")
library(Hmisc)
mydataframe-spss.get("mydata.sav",use.value.labels=TRUE)其中use.value.labels=TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子。
访问数据库管理系统
要使用R访问数据库,首先需要很对数据库类型安装和配置合适的ODBC驱动。
安装RODBC包:install.packages("RODBC")
举个栗子:
library(RODBC)
myconn-odbcConnect("mydsn",uid="Rob",pwd="aardvark")通过用户名密码登录数据框mydsn,并建立连接。
crimedat-sqlFetch(myconn,Crime)通过连接myconn访问mydsn数据库,获取Crime这个表,以数据框形式返回给crimedat。
pundat-sqlQuery(myconn,"select*fromPunishment")使用查询语句对mydsn数据库进行查询,并以数据框形式返回给pundat
sqlSave(channel,tablename=sqtable,append=FALSE)将数据框写入到ODBC数据库的某个表中。如果append=TRUE,则为更新。
sqlDrop(channel,sqtable)删除ODBC数据框中的某个表
close(channel)关闭连接
标注数据集:
为变量名添加描述性标签
将变量标签作为变量名,然后通过位置下标来访问这个变量。费这个劲呀...
names(patientdata)[2]-"Ageathospitalization(inyears)"把names()应该是取一个数据框的变量名的意思,返回的应该是个向量。该赋值语句把其中第二个变量名改成了双引号中的内容。后面再需要引用这个变量时,就直接写patientdata[2]
为类别型变量中的编码添加值标签
举个栗子:名为gender的变量,1,2分别代表男,女,这时可以使用代码:
patientdata$gender-factor(patientdata$gender,levels=c(1,2),labels=c("male","female"))意思是,把数据框patientdata中的变量gender转换为因子,有两个水平,1和2;对应的标签分别是:male和female。(这里labels中的参数必须得是gender原有的值吧?要不然知道把谁对应为1把谁对应为2啊?)
几个常用函数:
length(object) 显示对象中的元素/成分数量
dim(object) 显示对象维度
str(object) 显示对象结构
class(object) 显示对象的类或类型
mode() 显示对象的模式(这是什么意思?)
names() 显示对象中个成分名称(还可以修改名称,如上例所示)
cbind(object1,object2,...) 按列合并对象(把待合并对象一列一列排起来)
rbind(object1,object2,...) 按行合并对象(把待合并对象一行一行排起来)
head(object) 列出对象的开始部分
tail(object) 列出对象的最后部分
ls() 列出当前的对象列表
rm(list=ls()) 除以点号开头的隐藏对象外,其他对象全部删除。
赞赏