读书笔记_第二章

#R中用于管理R工作空间的函数
getwd() #显示当前的工作目录
dir.exists("D:/Script/R/charpter_2") #判断当前文件夹是否存在,FALSE,TRUE
dir.create("D:/Script/R/charpter_2") #创建charpter_1文件夹
setwd("D:/Script/R/charpter_2") #修改当前的工作目录,windows显示:D:\Script\R,必须修改为反斜杠方向


#基本数据结构

#注意区分标量,它只含有一个元素,即单元素向量构成标量
b1<-3  #数值型

b3<-"US" #字符型

b2<-TRUE #逻辑型

#No.1 向量,用于存储数值型,字符型,或逻辑型数据的一维数组,必须同类型
a<-c(1,2,5,3,6,-2,4) #数值型向量
b<-c("one","two","three")
c<-c(TRUE,TRUE,TRUE,FALSE,TRUE,FALSE)
d<-c(3,TRUE,FALSE,"String") #混合存储时,类型按照最低级的来,自动处理成最低级的一种,字符型<数值型(true=1,false=0)<逻辑型


#     向量整体访问
d


#     向量部分访问
a[3]  #下标访问法,单值型,位置标号从1开始
a[6:7] #下标访问法,多值型一,必须是连续的位置编号,等价于a[c(6,7)]
a[c(1,3,5)] #下标访问法,多值型二,可按照随机位置显示
a[c(1,5,3)] #下标访问法,多值型二,可按照随机位置显示

#No.2 矩阵,二维数组,用于存储数值型,字符型,或逻辑型数据,必须同类型

#自定义矩阵m1: 1~20作为数据,5行,4列,默认按列填充,列名,行名系统自动生成
m1<-matrix(1:20,nrow = 5,ncol=4) 
m1 #同时指定行数,列数

m11<-matrix(1:20,nrow= 5)
m11

#自定义矩阵m2: 1~20作为数据,5行,4列,默认按列填充,列名,行名系统自动生成
cells <- c(1,26,24,58)
r_names<-c("R1","R2")
c_names<-c("C1","C2")

m2 <- matrix(cells,nrow = 2,ncol = 2,byrow=TRUE,dimnames = list(r_names,c_names))
m2 #按照行填充,即先写满一行

m3 <- matrix(cells,nrow = 2,ncol = 2,byrow=FALSE,dimnames = list(r_names,c_names))
m3 #按照列填充,即先写满一列

#访问矩阵数据
m11[2,3] #返回行号=2,列号=3,单个元素值=12
m11[2,]  #返回行号=2,列号不限定,整行元素值
m11[,3]  #返回行号不限定,列号=3,整列元素值
m11[2,c(3,4)] #返回行号=2,列号=3,单个元素值=12;返回行号=2,列号=4,单个元素值=17;

#No.3 数组,维度大于二,用于存储数值型,字符型,或逻辑型数据,必须同类型

#自定义数组
dim1 <- c("A1","A2") #维度一,行
dim2 <- c("B1","B2","B3") #维度二,列
dim3 <- c("C1","C2","C3","C4") #维度三,块

z<-array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3)) #数组2行,3列,4块
z #数组是矩阵的一个推广

#No.4 数据框,与矩阵相似,但不要求完全同类型,单要求每一列同类型,最常处理的数据类型
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

patientdata2 <- data.frame(patientID,age,diabetes,status,row.names = patientID) #为数据框,追加实例标识符
patientdata2 #暂时看不出效果,标记各类打印输出和图形中实例名称所用的变量

#数据框元素访问
patientdata[1:2] #列下标访问,返回第一列,第二列全部数据,列编号从1开始
patientdata[c("patientID","age")] #列名访问,返回列名对应列,顺序未调整
patientdata[c("age","patientID")] #列名访问,返回列名对应列,顺序已调整
patientdata$patientID #对象访问

patientdata[1,2] #返回第一行,第二列元素25

#数据框转换成列联表
t <- table(patientdata$diabetes,patientdata$status) 
t #行元素按照diabetes罗列,列元素按照status值罗列,然后计数,填充,形成列联表


#优化对象访问方式

#未出现与全局变量同名的对象时

#繁琐形式
summary(mtcars$mpg)
plot(mtcars$mpg,mtcars$disp)
plot(mtcars$mpg,mtcars$wt)


#简化形式
search() #返回当前加载的软件包
attach(mtcars) #将mtcars对象作为独立的软件包加载到search路径中的第二位,其余往后顺延
summary(mpg) #mpg被系统认定为mtcars的对象
plot(mpg,disp)
plot(mpg,wt)
detach(mtcars) #将mtcars对象作为独立的软件包从search路径中的第二位删除,其余往前补位


#出现与全局变量同名的对象时
#建议attach,detach函数最好对一个单独的数据,而且与全局变量没有命名冲突时使用

#报错示例
mpg <- c(25,36,47)
attach(mtcars) #提示mtcars对象中mpg与全局变量冲突
plot(mpg,wt) #画图失败

mpg #直接引用,反馈全局变量值

#规避示例
with(mtcars,{
    stats_no <- summary(mpg)
    stats_yes <<- summary(mpg)
    print(summary(mpg))
    plot(mpg,disp)
    plot(mpg,wt)
}

stats_no #with的局限性,<-赋值仅在此函数的括号内生效
stats_yes #with的局限性,<<-赋值仅在此函数的括号内生效


#No.5 列表,最复杂的一种,其他类型都可以往里面塞
g <- "My First List"  #g为一个字符串
h <- c(25,26,18,39)   #h为一个长度为4的数值型向量
j <- matrix(1:10,nrow=5) #j为一个5行,2列的数值型矩阵
k <- c("one","two","three") #k为一个长度为3的字符型向量
mylist <- list(title=g,ages=h,j,k) #列表包含四个对象,name1=object1,仅前两个有名字

#访问列表对象
mylist #整体访问
mylist[1] #访问第一个对象
mylist["title"]
mylist$title

mylist[2]#访问第二个对象

mylist[[2]] #双重方括号指名代表某个成分的数字或名称来访问列表中的元素
mylist[["ages"]]


#补充事项

#越界赋值
#将一个值赋给某个向量,矩阵,数组或者列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值
x <- c(8,6,4)
x[7] <- 10
x #长度自动扩充为7,原值保留,新位置没值的填充NA
x <- x[1:3]  
x #重新缩减为3个长度的向量


#因子化
#名义型变量,属于类别变量,没有顺序之分
#有序型变量,属于类别变量,有顺序之分
#连续型变量,不属于类别变量,有顺序之分,同时也代表数量

#其中名义型变量,有序型变量在R中统称为因子
#因子在R中非常重要,因为它决定了数据的分析方式及如何进行视觉呈现

#因子化名义型变量
diabetes <- c("Type1","Type2","Type1","Type1")
d_f <- factor(diabetes)
d_f 
str(d_f) #利用str查看后台存储向量

#因子化有序型变量
status <- c("Poor","Improved","Excellent","Poor")
s_f <- factor(status,order = TRUE) #排序参数使用order,或者ordered都对
s_f #字符型,默认按照字母顺序
str(s_f)

s_f2 <- factor(status,ordered = TRUE,levels = c("Poor","Improved","Excellent")) #字符型,默认按照字母顺序
s_f2 #字符型,手动设定按照顺序
str(s_f2)


#因子化逆向操作
sex <- c(1,2,2,1)
se_f <- factor(sex,levels = c(1,2),labels = c("Male","Female"))
#levels代表变量的实际值,而labels表示需要显示的值
se_f

#因子的使用
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) 
str(diabetes) #仅在用str()函数时才能看出来后台存储向量形式(1,2,1,1)
status <- factor(status,order = TRUE)
patientdata <- data.frame(patientID,age,diabetes,status)
str(patientdata) #查看数据框的结构
summary(patientdata)# 汇总,数值型(计算),因子型计频数,不一样
names(patientdata)  #返回列名向量
names(patientdata)[2] <- "Age at hospitalization(in years)" #重命名列名向量其中元素
names(patientdata)  #返回重命名后列名向量

#导入数据

#No.1 手动录入,预定义个空数据框,调用文本编辑器手动录入数据
mydata <- data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
mydata <- edit(mydata) #edit相当于在一个副本上进行,必须赋值,否则修改会丢失
fix(mydata) #与mydata <- edit(mydata)语句等价,更简单的写法
mydata

#No.2 手动录入,预定义文本,采用read.table函数转换
mydatatxt <- "
age   gender  weight
25      m       166
30      f       115
18      f       120
" # 字符串标量,字符型变量
mydata <- read.table(header = TRUE,text = mydatatxt)
mydata

#No.3 从带分隔符的csv文本文件导入数据
#注意csv文件最后一行需加回车,列名称必须与原文件保持一致,否则有两条报错提示
grades <- read.table("studentgrades.csv",header = TRUE,row.names = "StudentID",sep=",")
grades #StudentID设定为行名后,第一个字符零被删除
str(grades) #read.table默认将字符型变量转化成因子

#stringasfactor=false会去掉默认转成因子的动作,或者使用colclasses选项指定类类型
grades <- read.table("studentgrades.csv",header = TRUE,row.names = "StudentID",sep=","
                     ,colClasses=c("character","character","character","numeric","numeric"
                                   ,"numeric"))
grades #StudentID设定为行名后,第一个字符零未被删除,字符格式未被因子化
str(grades)


#No.4 从excel导入数据

#方法一,将xlsx文件,另存为csv文件(注意双引号,考虑替换,或者逗号),使用read.table完成
grades <- read.table("f_xlsx.csv",row.names = "StudentID",header = TRUE,sep=","
                     ,colClasses=c("character","character","character","numeric","numeric"
                                   ,"numeric"))
grades #StudentID设定为行名后,第一个字符零未被删除,字符格式未被因子化
str(grades)

#方法二,利用xlsx包中read.xlsx()函数
library(rJava)
library(xlsxjars)
library(xlsx) #依赖的包,必须先行加载

grades <- read.xlsx("studentgrades.xlsx",1) #不考虑双引号,分割问题,读第一个工作表
#大型数据,采用read.xlsx2()


#处理数据对象的实用函数
length(a)  #显示对象中元素、成分的数量
dim(a) #向量维度为1
dim(m3) #矩阵维度为2行*2列 
dim(patientdata) #数据框维度为4行* 4列
str(a) #查看对象的结构
class(a) # 查看对象的类和结构
mode(a) #查看对象的模式
names(patientdata) #查看各元素的名称,支持名称修改
cbind(c(1,2,3),c(4,5,6),c(7,8,9)) #按列合并对象
rbind(c(1,2,3),c(4,5,6),c(7,8,9)) #按行合并对象
a #输出向量a的值
head(patientdata) #显示开始的部分,默认前6行
tail(patientdata) #显示最后的部分,默认末尾6行
ls() #显示当前Environment窗口下所有对象的列表
rm(list=ls()) #删除当前工作环境中的几乎所有对象


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值