小白读《R语言实战》写的读书笔记(第二章)

#####第二章:数据结构#####
####1、向量####
#c()
a <- c(1,2,5,3,6,-2,4)
b <- c("one", "two", "three")
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
#通过方括号中给定元素所处位置的数值,可以访问向量的元素。
d <- c("k", "j","h", "a", "c", "m")
d[3] #d中的第3位
d[c(1, 3, 5)] #d中的第1、3、5位
d[2:6] #d中的第2至6位,这里的:代表生成一个连续数值序列

####2、矩阵####
matrix()
#矩阵的一般使用格式如下:
#myymatrix <- matrix(vector, nrow = number_of_rows, ncol = number_of_columns,
#                    byrow = logical_value, dimnames = list(
#                      char_vector_rownames, char_vector_colnames))
#vector包含了矩阵中的元素(Jhon注:vector处需要填具体的值,可以是表达值,而非数量)
#nrow和ncol是指定行和列数(即矩阵的维度),
#dianames包含了可选的,以字符表示的行名和列名
#byrow表示矩阵应当按行填充(byrow=TRUE),还是按列填充(byrow=FALSE),默认按列填充。
##以下是矩阵在书中的代码
y <- matrix(1:20, nrow = 5, ncol = 4) #创建一个1到20有20个变量的矩阵,行为5,列为4
y
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
mymatrix2 <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
                   dimnames = list(rnames, cnames))
mymatrix2

#定位矩阵中的元素
x <- matrix(1:10, nrow = 2)
x
x[,2]
x[2,]
x[1,4]
x[1,c(4,5)] #第1行第4,5个元素

####3、数组####
##一维向量,二维矩阵,三维数组(john注)
#数组的一般格式如下:
#myarray <- array(vector, dimensions, dimnames)
#vector是数组中的数据,dimensions是一个数值型的向量,给出了各维度的最大值,dimnames是可选的、各维度名称标签列表
#书中代码如下
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))
z
#这里输出的结构将第三维度展开,成为3个二维的矩阵
#定位元素
z[1,2,3]


####4、数据框####
#从书中的解释来看,数据框其实就相当于Excel或者Word里的表格
#数据框对于R来说是非常重要的内容,包括后文中的tibble数据框(John注)
#数据框中可以填入任何格式的变量,后续的运算也是根据数据框来进行的(John注)
#数据框的函数是:data.frame()
#表达式是:mydata <- data.frame(col1, col2, col3, ...)
#数据框的数据是以列的方向填入的,col1, col2, col3等即列名
#术中代码如下:
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
#选取数据框中的元素#
patientdata[1:2] #patientdata中第1到2列
patientdata[c("diabetes", "status")] #patientdata中diabetes和status列
patientdata$age #直接定位age列
#$符号用于选取一个给定数据框中的某个特定变量,如:
table(patientdata$diabetes, patientdata$status) #生成了diabetes和status的列联表(看样子就是四格表,john注)


##使用with()函数
#书中用了R中自带的mtcars数据框为例
#其中mpg为每加仑汽油行驶英里数,disp为发动机排量,wt为汽车重量
#源代码如下:
summary(mtcars$mpg)
plot(mtcars$mpg, mtcars$disp)
plot(mtcars$mpg, mtcars$wt)
#代码简化如下
with(mtcars, {summary(mpg)
  plot(mpg, disp)
  plot(mpg, wt)
  })
#函数with()的局限在于,赋值仅在此函数的括号内生效,以下是书中的代码:
with(mtcars,{
  stats <- summary(mpg)
  stats
  })
stats #这里无法导出stats
#如果要创建with()意外存在的对象,可以用特殊赋值符<<-代替赋值符《-
#代码如下:
with(mtcars, {
  nokeepstats <- summary(mpg)
  keepstats <<- summary(mpg)
  })
nokeepstats
keepstats

#实例标识符
####书中第26页记录的实例标识符,暂时没有搞懂,后面再看吧
#实例标识符制定为R中表及各类打印输出和图形中实例名称的变量
#书中代码如下:
patientdata <- data.frame(patientID, age, diabetes, status, row.names = patientID)
patientdata

####5、因子####
#按照书中的描述,因子=二分类变量+有序分类变量
#与之相对的是连续型变量
#用factor()可以定义因子,书中用diabetes为例:
diabetes <- c("Type1", "Type2", "Type1", "Type1")
diabetes2 <- factor(diabetes)  #其内部关联为1=Type1,2=Type2,具体赋值顺序根据字母顺序而定
diabetes2
#有序分类变量需要定义参数ordered=TRUEE,书中以status为例:
status <- c("poor", "improved", "excellent", "poor")
status2 <- factor(status, ordered = TRUE)
status2
#这里的顺序默认是按照字母顺序建立的,而有时并非是需要按照字母顺序而定的
#这里可以指定levels来覆盖默认的排序
#书中代码如下:
status <- c("poor", "improved", "excellent", "poor")
status3 <- factor(status, ordered = TRUE, 
                  levels = c("poor", "improved", "excellent"))
status3
#数值型变量可以用level和labels参数来编码因子
#书中编码性别的代码如下:
sex <- factor(sex, levels = c(1, 2), labels = c("male", "female"))
#这段代码前面并没有定义sex的具体值,所以暂不执行
#以下为2-6因子使用的代码:
patientID <- c(1,2,3,4)
age <- c(25,34,28,52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("poor", "improved", "excellent", "poor")
diabetes2 <- factor(diabetes)  
status2 <- factor(status, ordered = TRUE)
patientdata <- data.frame(patientID, age, diabetes2, status2)
str(patientdata)
summary(patientdata)

#因子的使用在书中分解为3个步骤:
#1、以向量的形式输入数据
#2、显示对象的结构
#3、显示对象的统计概要:str(object)函数提供R中某个对象的信息
###这里我总结:引入因子的概念只是为了把文本变为数值型变量,方便下一步运算,相当于SPSS中为数值型变量添加标签

####6、列表####
##列表可以将目前所有的对象(包括向量、矩阵、数据框)整合到一起,不论是否相关
#其函数是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
mylist[[2]]
mylist[["ages"]]
mylist$ages #对于之前命名的部分可以用$来查找
#列表有两个重要的意义:
#1、列表可以用一种简单的方式组织和重新调用不相干的信息
#2、许多R函数运行的结果都是以列表的形式返回的
#john注:列表的概念可能超出了目前对统计学的认识,列表只是有一个框框,里面可以填入任何东西


####7、tibble数据框####
#tibble 也是一种数据框,它对传统数据框的功能进行了一些修改,更易于使用
#tibble 在输出时,列名下面有一行字母的缩写,描述了每个变量的类型
#int-整数型、dbl-浮点型、chr-字符串型、lgl-逻辑型(True和False)、fct-因子型、date-日期型、dttm-日期时间型
#tibble是tidyverse套装中的一员
#首先是要安装tibble与加载包,代码如下:
install.packages("tibble")
library(tibble)
#与 data.frame 的对比:
#1、不会自动转换列类型:data.frame会自动把字符型变量转换成因子,即分类变量
#2、支持非法列名,只需要用反引号把列名括起来,如列名为 `:)`
#3、输出时自动根据窗口大小调整,排版更加美观
#4、用 [] 选取列子集,即使只选取 1 列,返回结果仍为 tibble,而不自动转成向量
#在实际使用时,tibble 和 data.frame 并没有太大的区别,只不过 tibble 更适合在 tidyverse 中使用
#以下是书中以mtcars为例的代码:
library(tibble)
mtcars1 <- as_tibble(mtcars)
mtcars2 <- data.frame(mtcars)
mtcars2
#tibble数据框查找子集会返回一个子集的tibble数据框,例:
mtcars1[, "mpg"]
#如果要返回一个单列的普通数据框则需要添加drop=FALSE,例:
mtcars1[, "mpg", drop = FALSE] #这里返回的并不是一个普通数据框,不知道为什么
mtcars1[, c("mpg", "wt")] #这是两列的查找格式

#####变量的输入#####
####1、使用键盘输入数据####
#R中存在一个手动输入数据的文本编辑器,调用函数是edit()
#具体使用步骤:
#1、创建一个空的数据框或矩阵,其中变量名和变量的最终格式需与最终格式一致
#2、调用edit()函数输入数据,并将结果保存在对象中
#书中代码如下:
mydata <- data.frame(age = numeric(0), gender = character(0), weight = numeric(0))
mydata <- edit(mydata)
mydata
#类似于age = numeric(0)是创建一个指定模式但不含实际数据的变量
#edit()的返回值必须赋值给一个目标变量,不然数据会丢失
#mydata <- edit(mydata)本身有个更简便的写法是:fix(mydata),尝试代码如下:
mydata <- data.frame(age = numeric(0), gender = character(0), weight = numeric(0))
fix(mydata)
##此外还可以之间在程序中嵌入数据集,书中代码如下:
mydatatxt <- "
age gender weight
25 m 166
20 f 155
18 f 120
"
mydata <- read.table(header = TRUE, text = mydatatxt)
mydata
#read.table()这个函数后面会具体再讲


####2、从带分隔符的文本文件导入数据####
#使用read.table()这个函数从带分隔符的文本文件中导入数据
#这个函数会读取一个表格格式的文件并将其保存为数据框
#语法如下:
#mydataframe <- read.table(file, options)
#其中file是一个带分隔符的ASCⅡ文件
#options是控制如何处理数据的选项,下方列出常见选项:
#header:一个表示文件是否在第一行包含了变量名的逻辑型变量
#sep:分开数据值的分隔符。默认是sep="”,这表示了一个或多个空格、制表符、换行或回车。使用sep=","来读取用逗号来分隔行内数据的文件,使用sep="\t"来读取使用制表符来分割行内数据的文件
#row.names:一个用于指定一个或多个行标记符的可选参数
#col.names:如果数据文件的第一行不包括变量名(header=FASLE),你可以用col.names 去指定一个包含变量名的字符向量。如果header=FALSE以及co1.names选项被省略了,变量会被分别命名为v1、V2,以此类推
#na.strings:可选的用于表示缺失值的字符向量。比如说,na.strings=c("-9",“?")把-9和?值在读取数据的时候转换成NA
#colClasses:定义每一列的变量类型。比如说,colClasses=c("numeric","numeric","character","NULL",“numeric")把前两列读取为数值型变量,把第三列读取为字符型向量,跳过第四列,把第五列读取为数值型向量。如果数据有多余五列,colClasses 的值会被循环。当你在读取大型文本文件的时候,加上colclasses 选项可以可观地提升处理的速度
#quote:用于对有特殊字符的字符串划定界限的字符串。默认值是双引号(")或单引号(')
#skip:读取数据前跳过的行的数目。这个选项在跳过头注释的时候比较有用
#stringsAsFactors:一个逻辑变量,表示字符型变量是否要转换为因子变量。在R4.0之前,其默认值为TRUE,而在最近的版本中,除非被colclasses 覆盖,否则其默认值为FALSE。在处理大型文本文件的时候,设置成stringsAsFactors=FALSE可以提升处理速度
#text:一个指定文字进行处理的字符串。如果text 被设置了,file应该被留空。2.3.1节给出了一个例子
##这里书中用一个文件名为studentgrades.csv文件为例,我已经准备好了,明确以下代码:
grades <- read.table("studentgrades.csv", header = TRUE, row.names = "StudentID", sep = ",")
grades
str(grades)
#重新导入数据,并同时为每个变量指定一个类型:
grades <- read.table("studentgrades.csv", header = TRUE, row.names = "StudentID", sep = ",",
                     colClasses = c("character", "character", "character", "numeric","numeric","numeric"))
grades
str(grades)
#read.table()还有许多种用法,详见:
help("read.table")
#书中还提示了许多其他类似的文件导入函数:file();gzfile();bzfile();xzfile();unz();url()
#对于二维文本,即只有行和列的文本,可以使用read.csv()和read.delim()函数,来读入
#read.csv()和read.delim()函数是对read.table()的简单封装
#read.csv()默认header = TRUE, sep = ","
#read.delim()默认认header = TRUE, sep = "\t"
#代码如下:
library(readr)
grades <- read.csv("studentgrades.csv")


####3、导入Excel数据####
#导入Excel文件最好的办法是将Excel文件保存成由分隔符组成的csv文件
#如果要从Excel文件导入R,需要用到rendxl包
#代码为:read_excle(file, n);file是Excel文件的所在路径,n是需要导入的工作表序号
library(readxl)
workbook <- "c:/myworkbook.xlsx"
mydataframe <- read_xlsx(workbook, 1) 
#read_excle(file, n)还可以制定某个单元区域,或者设置每个列的类,详见help(read_excel)

####4、导入JSON数据####
#这个不需要,书中也未写明

####5、从网页抓取数据####
##这点书中未写明白,但在解螺旋课程中会被反复应用,到时候再学吧。

####6、导入SPSS数据####
#读取SPSS数据需要用到haven包中的函数read.spss()
install.packages("haven") #切记安装包的时候需要双引号"",加载包的时候不需要
#加载并读取
library(haven)
mydataframe <- read_spss("mydata.sav")
#如需导入SPSS数据,详见书中38页

####7、导入SAS数据####
#需要用到haven包中的read_sas()函数,具体见书中38页

####8、导入Stata数据####
#需要用到haven包中的read_dta()函数,具体见书中39页

####9、访问数据库管理系统####
#书中并未记录我所需要的数据库,暂时不学,如遇到我需要的数据库可再复习

####10、通过Stat/Transfer导入数据####


#####数据集的标注#####
#1、变量标签:变量标签知识对原有变量名的重新赋值,详见书39页
#2、值标签:用factor()函数创建值标签,书中以前文patientdata$gender变量为例,代码如下:
patientdata$gender <- factor(patientdata$gender,
                             levels = c(1,2),
                             labels = c("male", "female"))

#####★处理数据对象的实用函数#####
#这一章的最后一节罗列了目前所用的一些常用函数,看来必须要背了
length(object) #显示对象中元素/成分的数量
dim(object) #显示某个对象的维度
str(object) #显示某个对象的结构
class(object) #显示某个对象的类或类型
mode(object) #显示某个对象的模式
names(object) #显示某对象中各成分的名称
c(object) #将对象合并入一个向量
cbind(object, object, ...) #按列合并对象
rbind(object, object, ...) #按行合并对象
object #输出某个对象
head(object) #列出某个对象的开始部分
tail(object) #列出某个对象的最后部分
ls(object) #显示当前的对象列表
rm(object, object, ...) #删除一个或更多个对象。语句rm(list=1s())将删除当前工作环境中的几乎所有对象
newobcect <- edit(object) #编辑对象并另存为newobject
fix(object) #直接编辑对象

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值