将军笔记之创建数据集

好奇心是强劲的智慧的最永久的特性之一。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指定列数,byrow TRUE或FALSE确定是按行排列还是按列排列(默认按列),dimnames指定行名和列名,行名和列名分别用向量表示。举例(Ctrl + L可以清屏):如下图所示:创建矩阵所用元素为向量cells中的元素。创建的是2x2的矩阵,按行排列元素。行名、列名已提前在向量rnmes和cnmes中规定好了,用的时候将两个向量变成一个list赋值给dimnames。(2017/04/12 20:08 矩阵从向量来。指定行名列名要用列表)
矩阵的创建
矩阵中元素的引用:
x[2,]第二行
x[,2]第二列
x[1,4]第一行第四列的元素
x[1,c(4,5)]第一行,第四第五个元素
维度超过2时,使用数组(这个后面用得很少啊...是因为维度很少超过2吗?);有多种模式的数据时,使用数据框。
2017/03/15 21: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,]。注意没有逗号的时候默认是选择的列。(2017/04/12 20: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()函数改写如下:( 2017/04/12 20: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) 实例标识符( 2017/04/12 20: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中某个对象的信息(2017/04/12 21:13 注意这里的str是structure,不是string);信息显示diabetes是个factor,而status是个Ord.factor。在summary返回的信息中,不同类型的变量得到了不同的处理,这就是指定因子的意义所在。
列表:
用list()创建列表:mylist <- list(object1,object2,...)
还可以为列表中的每个对象取名字:mylist <- list(name1=object1,name2=object2,...)
举个大栗子:
列表的创建与列表元素的获取
如图中所示,列表的创建如上所说,没啥可再说的。列表元素的获取可以通过两种方式进行:一是索引号,二是题目。不管索引号还是题目都放在双方括号中( 2017/04/12 21:15 访问列表元素要用双方括号来索引),题目需要用双引号围起来。题目的使用不影响索引号,比如列表中的第二个元素,虽然加了ages这个题目,但是索引号依然是2。( 2017/04/12 21: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) 出现如图所示的界面,即可编辑数据(2017/04/12 21: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用于指定表示行标识符的变量( 2017/04/12 21: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是文件中的一个工作表。从文件句柄中获取一个工作表,赋值» 51 29945 51 15290 0 0 3532 0 0:00:08 0:00:04 0:00:04 3531mydataframe
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 * from Punishment") ä½¿ç¨æ¥è¯¢è¯å¥å¯¹mydsnæ°æ®åºè¿è¡æ¥è¯¢ï¼å¹¶ä»¥æ°æ®æ¡å½¢å¼è¿åç»pundat
sqlSave(channel,tablename=sqtable,append=FALSE) å°æ°æ®æ¡åå ¥å°ODBCæ°æ®åºçæä¸ªè¡¨ä¸ã妿append=TRUEï¼åä¸ºæ´æ°ã
sqlDrop(channel,sqtable) å é¤ODBCæ°æ®æ¡ä¸çæä¸ªè¡¨
close(channel) å ³éè¿æ¥
æ æ³¨æ°æ®éï¼
为åéåæ·»å æè¿°æ§æ ç¾
å°åéæ ç¾ä½ä¸ºåéåï¼ç¶åéè¿ä½ç½®ä¸æ æ¥è®¿é®è¿ä¸ªåéãè´¹è¿ä¸ªå²å...
names(patientdata)[2] <- "Age at hospitalization (in years)" æ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()) é¤ä»¥ç¹å·å¼å¤´çéè对象å¤ï¼å ¶ä»å¯¹è±¡å ¨é¨å é¤ã