数据结构
数据结构:向量、矩阵、数组、数据框、因子、列表
向量
- 用于储存数值型、字符型或逻辑性数据的一维数组。
- 同一向量中的数据必须为同一模式;例如同为数值型
- 通过方括号
[ ]
给定元素所处位置的数值来访问向量中的元素
标量:只含一个元素的向量
a[1]
a[2:6]
a[c(2,4)]
矩阵&数组
-
矩阵:二维数组,每个元素都拥有相同的模式(数值型、字符型、逻辑型)
- 使用方括号
[]
和下标 来选择矩阵中的行、列或元素; - matrix(vector, nrow=n1, ncol=n2, byrow=FALSE, dimnames=list(rnames, cnames))
- 使用方括号
nrow/ncol = n,表示行列的数量,即维度
byrow = FALSE(默认), 按列填充
dimanems=list() : 可选的,以字符型向量命名的行名与列名
x<- matrix(1:10, nrow=2)
x[2,]
x[1,4]
x[1,c(4,5)]
-
数组:任意维度的向量;是矩阵的自然推广
- array(vector, dimensions, dimnames=list())
数据框
-
不同的列可以包含不同模式(数值型、字符型等)的数据,通常用
data.frame()
创建 - 通过方括号
[ ]
与$
以及attach()&detach() 或 with()
进行选取列- 列所处位置的数值
- 指定列名
- 运用
with()
进行数据框绑定,用花括号{ }
来指定对数据框执行的语句;- 对象仅存在于with()结构以内
- 若要创建with()结构以外也存在的对象,使用特殊赋值符号
<<
替代标准的赋值符号<
;可以将对象保存在全局环境中
## 指定 列所处位置的数值
patientdata[1:2]
## 指定列名
patientdata[c("disbetes", "status")]
patientdata$diabetes
## --------with()绑定数据框-----------------------#
with(mtcars, {
stats <- summary(mpg)
stats
})
列表
- 列表:任意对象的有序集合;列表允许若干个对象到单个对象名下。(即列表可能是向量、矩阵、数据框,甚至是其他列表的组合)
- 通过双重括号
[[ ]]
中指名代表某个成分的数字或名称来访问列表中的元素 - list(name1 = object1, name2 = object2)
- 通过双重括号
mylist[[2]]
mylist[['age']]
mylist$age
结构判断
-
str():返回对象整体的数据结构
-
class():返回单个对象格式/类型
-
mode():返回对象模式
-
dim():返回对象维度
-
summary():统计摘要;区别对待不同类型的数据变量- (1)数值型:相关极值等信息;(2)名义型/有序型:显示的是各水平的频数值
数据类型
因子
变量类别型变量(名义型、有序型)和连续型变量;
- 名义型变量:没有顺序之分的 [类别型] 变量
- 有序型变量:一定顺序的 [类别型] 变量
- 连续型变量:呈现某个范围内的任意值,并同时表示了顺序和数量。
- <u>[名义型、有序型] 变量在R中称为 [因子] (factor)</u>
- 函数factor() 以一个整数向量的形式存储类别值,范围为[1..k](k是名义型变量中唯一值的个数),同时一个字符串(原始值)组成的 内部向量 将映射到这些整数上
- facotr(x, ordered=FALSE, levels=c(), labels=c(), exclude=NA):
ordered = FALSE(默认);若为TRUE,则为有序型变量
- 对字符型向量,默认顺序按 英文字母顺序创建 [a-z]
levels=c():覆盖默认排序的顺序;保证指定的水平与数据中的真实值相匹配,因为任何在数据中出现而未在参数列举中的数据都会被设为缺失值
labels=c():将有序型变量转化为名义型变量;
- 标签的顺序必须和因子水平的顺序相一致;
- 所有不一致的变量将被设为缺失值NA
exclude =NA:转变为因子时排除在外的变量,即不参与有序化;
> diabetes<- c('type1','type2','type1','type1')
> diabetes <- factor(diabetes);diabetes
[1] type1 type2 type1 type1
Levels: type1 type2
# --------有序型因子,order=T------------------------------#
> status <- c('poor','improved','excellent','poor')
> status <-factor(status, ordered=T);status
[1] poor improved excellent poor
Levels: excellent < improved < poor
# 覆盖原有的因子顺序 -- levels=c()为指定的顺序
status <-factor(status, ordered=T, levels=c('poor','improved','excellent'));status
[1] poor improved excellent poor
Levels: poor < improved < excellent
# levels中的值必须在数据中出现; 参数中为出现的值默认被设置NA
> status <-factor(status, ordered=T, levels=c('poor','improved','x'));status
[1] poor improved <NA> poor
Levels: poor < improved < x
# 变更为无序因子(名义型变量)
> status;
[1] poor improved excellent poor
Levels: excellent < improved < poor
factor(status, labels=c(1,2,3)) # 标签的顺序必须和因子水平的顺序相一致
[1] 3 2 1 3
Levels: 1 < 2 < 3
# 因子化时排除某个变量
> x <- factor(c(1, 2, 3), exclude = 3); x
[1] 1 2 <NA>
Levels: 1 2
语句
diabetes <- factor(diabetes)
将此向量存储为(1,2,1,1)(以一个整数向量的形式存储类别值,范围为[1..k]),并在内部将其关联为 1 = type1 和 2 =type2(具体赋值根据字母顺序而定)针对向量diabetes进行的任何分析都会将其作为名义型变量对待,并自动选择适合这一测量尺度的统计方法
语句
status <-factor(status, ordered=T)
将向量存储为(3,2,1,3),并在内部关联为 1=excellent, 2=improved, 3=poor
数据类型 & 转换
-
数值型 -
is.numeric()
&as.numeric()
- 整数型
is.integer()
&as.integer()
- 双精度型
is.double()
&as.double()
- 整数型
-
字符串形式
is.character()
&as.character()
-
逻辑型
is.logical()
&as.logical()
-
因子型
is.factor()
&as.factor()
as.factor(x) -- 只能对整个数据/列进行转换,其中无法插入其他语法
在作图时因子化需用
factor
-
向量型
is.vector()
&as.vectro()
-
矩阵型
is.matrix()
&as.matrix()
-
数组型
is.array()
&as.array()
-
数据框型
is.data.frame()
&as.data.frame()
# 多列变更
data[,col:col] <- lappy(gb[,col:col], as.numeric)
# gb[,c("net_activation","total_income")] <- lapply(gb[,c("net_activation","total_income")], as.numeric)
数据选取
元素选取
负号表示排除
## 负号:表示排除某一列
mtcars[,-1] # 表示排除第一列
## 向量的选取
# 位置选取
a[2]; a[1:6]; a[c(1,4)];
# 判断选取
a[a>2]; a[a==2]
## 矩阵&数据框选取
# 位置选取
a[1,]; a[,1]; a[1,2]; a[1, c(4,5)]
## 数据框选取
# 位置选取
mtcars[1,]; mtcars[,1]; mtcars[1:2,]; mtcars[,1:2]
mtcars[1:2] # 默认选取列,选取1与2列
mtcars[1:2, 3:4]
mtcars[c('wt')]; mtcars[1:2, c('wt','hp')]
mtcars$hp # 运用 $ 进行选取
逻辑选取
- 逻辑选取,后端运行分为两步
- 根据已有的条件对每个对象进行判断,结果为TRUE或FALSE
-
指定某个对象中提取为TURE的值
- <u>该对象的类型必须与条件判断的对象类型相同</u> 或者说 <u>前的范围必须 $\le$ 后者</u>;
mtcars$wt[mtcars$carb==2]
:选取carb为2的wt列;注意,wt与carb的对象均为列;
mtcars[mtcars$carb==2]
:会报错,提示undefined columns selected
;此时前者范围大于后者;<u>因为mtcars有n列,但逻辑为TRUE的只有一列,无法判断应该选取哪一列,故报错。</u>
mtcars$carb[mtcars>2]
: 可以运行;不满足的部分用NA显示
# 逻辑判断选取
mtcars[mtcasr>10]
mtcars$hp[mtcars>10]
子集选取 - subset
-
subset(x, subset, select, drop = FALSE, ...) :
- S3 method for class 'data.frame'
subset :选取的逻辑表达式;选取条件
select :选择的列
subset(airquality, Temp > 80, select = c(Ozone, Temp))
subset(airquality, Day == 1, select = -Temp)
subset(airquality, select = Ozone:Wind)
控制流
重复和循环
-
for结构 :
for (var in seq) statement
- 循环执行某语句statement,直到某个变量var的值不在包含在序列seq中为止
for (i in 1:10) print("hello")
-
while结构 :
while (cond) statment
- 必须确保cond中的条件语句能【被改变】(即它在某个时刻不在为真),否则循环将永不停止
条件执行
表示相等
==
-
if-else结构:
if (cond) statement
或者for (cond) statement1 else statement2
if (!is.factor(grade)) gerade <- as.factor(grade) else print("Grade already is a factor")
-
ifelse结构:
ifelse(cond, statement1, statement2)
ifelse(sorce>0.5, print("Passed"), print("Failed"))
outcome <- ifelse(socre>0.5, "Passed", "Failed")
-
switch结构:根据一个表达式的值选择语句执行
switch(expr,...)
expr之后的…是expr的可能取值,后接等号(=),表示执行的行为
switch语句中,不同条件末尾要有 [逗号]
若expr为文本形式,输入时需加 [引号]
feelings <- c("sad", "afraid")
for (i in feelings)
print(
switch(i,
happy = "I am glad you are happpy", # 用逗号分隔
afraid = "There is nothing to fear",
sad = "Cheer Up",
angry = "Calm down now"
)
)
逻辑判断
- which(): 返回为真的逻辑对象,允许对数组array使用
自编函数
- 结构
myfunction <- function(arg1, arg2, ...){
statements
return(object)
}
实用函数
- length(x):对象x的长度
- seq(from, to, by):生成一个序列
- rep(x, n):将x重复n次
- cut(x, n):将连续型变量分为n个水平的因子
- ptetty(x, n):将连续型变量分为n个区间
- cat(..., file="myfile", append=FALSE):连接...的对象,并将其输出到屏幕上或文件中
> cat("hello", "bob", "\b.\n", "Is\'t R", "\t", "Great?\n","!")
hello bob.
Is't R Great?
!
cat( ) 与 paste( ) 相同与区别
- 区别:
- paste( ) 对应的列单独合并
- cat( ) 合并为一个单元格
paste(c("X","Y"),1:10,sep="") # [1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10" cat(c("X","Y"),1:10,sep="") # XY12345678910
funs的用法
- 直接在函数中写明需要运行的函数
summarise(., vars(), mean)
- 结合funs写出调用的函数
summarise(., vars(), funs(mean))
summarise_all(df1[,-1],funs(mean,sum)) # 若出现两个及以上的函数,列名中自动添加后缀
summarise_all(df1[,-1],funs(sum(.*2))) # 所有数据用.表示
summarise_all(df1[,-1],funs(medi=median)) # 指定得到的列后缀名, 函数仍为miedan
summarise_all(df1[,-1],funs("in"=median)) # 或者加引号 (因为in在R中表示其他含义)
mutate_all(df1[,-1],funs(.^2))
关于报错
-
This function should not be called directly :该函数在多个包中有同样的名字
- 指定某个包的函数 dplyr::summarise()
- 移除某个包 detach(package:plyr)
符号的使用
基本符号
-
( )
定义函数的参数 -
( )
在运算中作为优先级 -
[ ]
用做对象的元素索引 -
{ }
作为代码段落的起止 -
%in%
表示包含
- 用分号
;
来分隔两个代码;
> x <- "AAABBBCCC"
> str_sub(x, 1, 1) <- 1; x
[1] "1AABBBCCC"
常见符号
写正则表达式的pattern时,要用两个转义符来进行转义
\\
,因为r中一个\
本身就是转义符的意思**Windows下路径要用斜杠
/
或者双反斜杠\\
**,原因同上
名称 | 作用 | 示例 | ||
---|---|---|---|---|
<- | 赋值符号 | |||
\ | 转义符 | |||
[ ] | 给定元素所处位置的数值 | a[c(2,4)] | ||
: | 用于表示一个数值序列 | a[2:6] | ||
[i,j] | 选择指定的行与列 | [i,][,j] [i,j][,] | ||
"" | 用于目录名、文件名、包 | |||
' ' | 引用双引号的文字为文本时出现 | labs(title=' positon="fill" ') | ||
# | 用于注释。#之后出现的任何文本都会被R解释器忽视; 并且R只能对单行进行注释,故当出现多条命令符,需在每行前面加上# | |||
$ | 选取一个给定数据框中的某个特定变量 | patientIDdata$age | ||
<<- | 特殊赋值符 | |||
[[ ]] | 用于列表中选取对象 | mylist[["ages"]] mylist[[2]] | ||
^或** | 求幂 | |||
x% %y | 求余数(x mod y) 5%%2=1 | |||
x% / %y | 整数除法。5%/2%=2 | |||
== | 严格等于(在浮点型数值时慎用==) | 2+2==4 | ||
!= | 不等于 | |||
!x | 非x | |||
x∣y | x或y | |||
x&y | x和y | |||
isTRUE(x) | 测试x是否为TRUE | |||
[,-1][-1,] [,c(-2,-3)]/[,-c(2,3)] | 删除第一列 删除第一行 删除多列,两种表达方式均可 | mydata<-mydata[,-1] mydata<-mydata[,-c(2,3)] | ||
"[" | 提取谋而对象一部分的函数,后跟序列数n;1表示该对象的第一部分; 2表示该对象的第二部分; |
R中常见表达式
符号 | 作用 | 示例 | 解释 |
---|---|---|---|
~ | 分隔符号 | y~x+z+w | 左边-因变量/响应变量 右边-自变量/解释变量 |
+ | 分隔预测变量 | ||
: | 预测变量的交互项 | y~x+z+x:z | |
* | 所有可能交互项的表达方式 | y~xzw---y~x+z+w+x:z+x:w+z:w | |
^ | 交互项的某个次数 | y~(x+z+w)^2---y~x+z+w+x:z+x:w+z:w | 交互项最高次为2次 |
. | 包含除因变量之外的所有变量 | y~.---y~x+z+w | 当一个数据框包含y,x,z,w这四个变量时 |
- | 减号,从等式中移除某个变量 | y~(x+z+w)^2-x:w--- y~x+z+w+x:z+z:w | |
-1 | 删除截距项 | y~x-1 | 拟合y在x上的回归,并强制直线通过原点 |
I() 【大写的i】 | 从算术(而非表示式)的角度来解释括号中的元素 | y~x+I((z+w)^2) | 表示的是x+(z+w)²,而非x+z+w+z:w |
function | 可以在表达式中运用的数学函数 | log(y)~x+z+w | |
mpg ~ wt | cyl | 表示按条件(cyl)绘图; | 即按cyl的水平为【分组条件】分别绘制mpg和wt的关系图 |
<Br>
研究设计表达式
表达式 | 作用 | 解释 |
---|---|---|
y~A | 单因素ANOVA | 1.小写字母,定量变量 2.大写字母,组别因子(若不转换为factor,则默认为定量协变量) 3.Subject,被试者独有的标志变量 4.Error(Subject/A),表示组内因子 |
y~x+A | 含单个协变量的单因素ANCOVA | |
y~A * B | 双因素ANOVA | 展开为 ~A+B+A:B |
y~x1+x2+A*B | 含两个协变量的双因素ANCOVA | |
y~B+A(B是区组因子) | 随机化区组 | |
y~A + Error(Subject/A) | 单因素组内ANOVA | |
y~B*W+Error(Subject/W) | 含单个组内因子(W)和单个组间因子(B)的重复测量ANOVA | 展开为 ~B+W+B:W |
字符规则
引用符 | 字符 | 含义 |
---|---|---|
Quotes | \n | newline;换行 |
Quotes | \r | carriage return |
Quotes | \t | tab;制表符 |
Quotes | \b | backspace;空格 |
Quotes | \a | alert (bell) |
Quotes | \f | form feed |
Quotes | \v | vertical tab |
Quotes | \ | backslash \ |
Quotes | ' | ASCII apostrophe '(单引号) |
Quotes | " | ASCII quotation mark "(双引号) |
Quotes | ` | ASCII grave accent (backtick) ` |
Quotes | \nnn | character with given octal code (1, 2 or 3 digits) |
Quotes | \xnn | character with given hex code (1 or 2 hex digits) |
Quotes | \unnnn | Unicode character with given code (1--4 hex digits) |
Quotes | \Unnnnnnnn | Unicode character with given code (1--8 hex digits) |
网友评论