Jimmy那些事儿

R_数据处理_basic

R_数据处理_basic

数据结构

数据结构:向量、矩阵、数组、数据框、因子、列表


向量

  • 用于储存数值型、字符型逻辑性数据的一维数组
    • 同一向量中的数据必须为同一模式;例如同为数值型
  • 通过方括号[ ] 给定元素所处位置的数值来访问向量中的元素

标量:只含一个元素的向量

1
2
3
4
5
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() : 可选的,以字符型向量命名的行名与列名

1
2
3
4
5
x<- matrix(1:10, nrow=2)
x[2,]
x[1,4]
x[1,c(4,5)]


  • 数组:任意维度的向量;是矩阵的自然推广
    • array(vector, dimensions, dimnames=list())


数据框

  • data.frame(…, row.names = NULL):创建数据框
  • 不同的列可以包含不同模式(数值型、字符型等)的数据,通常用data.frame()创建
  • 通过方括号[ ]$ 以及 attach()&detach() 或 with()进行选取
    • 列所处位置的数值
    • 指定列名
    • 运用with()进行数据框绑定,用花括号{ }来指定对数据框执行的语句;
      • 对象仅存在于with()结构以内
      • 若要创建with()结构以外也存在的对象,使用特殊赋值符号<<替代标准的赋值符号< ;可以将对象保存在全局环境中
1
2
3
4
5
6
7
8
9
10
11
12
13
## 指定 列所处位置的数值
patientdata[1:2]
## 指定列名
patientdata[c("disbetes", "status")]
patientdata$diabetes
## --------with()绑定数据框-----------------------#
with(mtcars, {
stats <- summary(mpg) # 可用全局赋值号 <<-
stats
})
  • 创建空数据框:从已有数据中获取,可免去设置格式
1
2
3
4
5
# 先获取
tbl_concurrency <- data.frame(point_time = point_time[1], interval_time=interval_time[1,1])
# 再删除第一行
tbl_concurrency <- tbl_concurrency[-1,]


列表

  • 列表:任意对象的有序集合;列表允许若干个对象到单个对象名下。(即列表可能是向量、矩阵、数据框,甚至是其他列表的组合)
    • 通过双重括号[[ ]]中指名代表某个成分的数字或名称来访问列表中的元素
    • list(name1 = object1, name2 = object2)
1
2
3
mylist[[2]]
mylist[['age']]
mylist$age


结构判断

  • str():返回对象整体数据结构

  • class():返回单个对象格式/类型

  • mode():返回对象模式

  • dim():返回对象维度

  • summary():统计摘要;区别对待不同类型的数据变量- (1)数值型:相关极值等信息;(2)名义型/有序型:显示的是各水平的频数值


数据类型

因子

变量类别型变量(名义型、有序型)和连续型变量;

  • 名义型变量:没有顺序之分的 [类别型] 变量
  • 有序型变量:一定顺序的 [类别型] 变量
  • 连续型变量:呈现某个范围内的任意值,并同时表示了顺序和数量


  • [名义型、有序型] 变量在R中称为 [因子] (factor)
  • 函数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:转变为因子时排除在外的变量,即不参与有序化;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
> 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.Date() & as.Date()is.datetime() & as.datetime()
  • 逻辑型 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()
1
2
3
# 多列变更
data[,col:col] <- lappy(gb[,col:col], as.numeric)
# gb[,c("net_activation","total_income")] <- lapply(gb[,c("net_activation","total_income")], as.numeric)


数据选取

元素选取

负号表示排除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 负号:表示排除某一列
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 # 运用 $ 进行选取


逻辑选取

  • 逻辑选取,后端运行分为两步
    1. 根据已有的条件对每个对象进行判断,结果为TRUE或FALSE
    2. 指定某个对象中提取为TURE的值
      • 该对象的类型必须与条件判断的对象类型相同 或者说 前的范围必须 $\le$ 后者

mtcars$wt[mtcars$carb==2] :选取carb为2的wt列;注意,wt与carb的对象均为列;

mtcars[mtcars$carb==2] :会报错,提示undefined columns selected ;此时前者范围大于后者;因为mtcars有n列,但逻辑为TRUE的只有一列,无法判断应该选取哪一列,故报错。

mtcars$carb[mtcars>2]: 可以运行;不满足的部分用NA显示

1
2
3
# 逻辑判断选取
mtcars[mtcasr>10]
mtcars$hp[mtcars>10]


子集选取 - subset

  • subset(x, subset, select, drop = FALSE, …)
    • S3 method for class ‘data.frame’

subset :选取的逻辑表达式;选取条件

select :选择的列

1
2
3
subset(airquality, Temp > 80, select = c(Ozone, Temp))
subset(airquality, Day == 1, select = -Temp)
subset(airquality, select = Ozone:Wind)


删除变量 - rm()


列表的批量操作

  • do.call(what, arg):对每个列表中元素进行合并

    • 告诉list一个函数,然后list里的所有元素来执行这个函数。

    相当于是列表list的apply函数

what : 一个函数 / 函数的对象名

arg : 一个列表list

1
2
# 合并list中的所有元素
sdo.call(rbind, list)


基础函数

数学函数

  • abs()
  • round(x, digits=2):代表保留小数位数的位数;
  • signif(x,digits=2):代表保留的有效位数
1
2
3
4
5
6
x<- 1.22341
> round(x,2)
[1] 1.22
> signif(x,2)
[1] 1.2


实用函数

  • length(x):R的对象、一个向量或因子;对象x的长度
  • seq(from, to, by):生成一个序列
  • rep(x, n):将x重复n次
  • cut(x, n):将连续型变量分为n个水平的因子
  • ptetty(x, n):将连续型变量分为n个区间
  • cat(…, file=”myfile”, append=FALSE):连接…的对象,并将其输出到屏幕上或文件中
1
2
3
4
> cat("hello", "bob", "\b.\n", "Is\'t R", "\t", "Great?\n","!")
hello bob.
Is't R Great?
!

cat( ) 与 paste( ) 相同与区别

  • 区别:
    • paste( ) 对应的列单独合并
    • cat( ) 合并为一个单元格
1
2
3
4
5
6
> 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))
1
2
3
4
5
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))


控制流

重复和循环

若需多个操作,可用大括号 {} 括起来

  • for结构for (var in seq) statement
    • 循环执行某语句statement,直到某个变量var的值不在包含在序列seq中为止
1
for (i in 1:10) print("hello")
  • while结构while (cond) statment
    • 必须确保cond中的条件语句能【被改变】(即它在某个时刻不在为真),否则循环将永不停止
1
2
i <- 10
while (i>0) {print("heloo"); i <- i-1}


条件执行

表示相等==

R的多条件嵌套,必须要用大括号{}括起来,各条件之间用分号;隔开;而非python的换行缩进即可;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
> b <- 1723
> for (i in 1720:b){
> print(i);print('--');
> for (a in (i+1):1723) { # 若写为 i+1:1723 默认为 i + (1:1723)
> print(i);print(a);print('==')
> }
> }
> [1] 1720
> [1] "--"
> [1] 1720
> [1] 1721
> [1] "=="
> [1] 1720
> [1] 1722
> [1] "=="
> [1] 1720
> [1] 1723
> [1] "=="
> .....
> [1] 1723
> [1] "--"
> [1] 1723
> [1] 1724 # 这里超出了上限; 可通过if 判断 if (a<=1723) {}
> [1] "=="
> [1] 1723
> [1] 1723
> [1] "=="
>
> # -------------修改后
> b <- 1723
> for (i in 1720:b){
> print(i);print('--');
> for (a in (i+1):1723) { # 若写为 i+1:1723 默认为 i + (1:1723)
> if (a<=1723) {
> print(i);print(a);print('==')}
> }
> }
>

>

  • if (cond) statment
  • if-else结构if (cond) statement 或者 for (cond) statement1 else statement2
1
if (!is.factor(grade)) gerade <- as.factor(grade) else print("Grade already is a factor")
  • ifelse结构ifelse(cond, statement1, statement2)
1
2
ifelse(sorce>0.5, print("Passed"), print("Failed"))
outcome <- ifelse(socre>0.5, "Passed", "Failed")

In while (i <= 10) { … :
报错:the condition has length > 1 and only the first element will be used

这里你的i应该是个向量,用 i <= 10来做条件的时候会出现很多个TRUE和FALSE,系统选用第一个作为标准


  • switch结构:根据一个表达式的值选择语句执行switch(expr,...)

expr之后的…是expr的可能取值,后接等号(=),表示执行的行为

switch语句中,不同条件末尾要有 [逗号]

若expr为文本形式,输入时需加 [引号]

1
2
3
4
5
6
7
8
9
10
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使用



应用

  • 下一个值减去上一个值,若差值大于等于x,则把该值为初始值,后续的值减去该初始值
1
2
3
4
5
6
7
8
9
time <- 0
base <- 1700
for (i in 1700:1723){
if (abs(i-base)>=5){
time <- time+1;
base <- i
}
}
print(time)


自编函数

  • 结构
1
2
3
4
myfunction <- function(arg1, arg2, ...){
statements
return(object)
}



关于报错

  • This function should not be called directly :该函数在多个包中有同样的名字
    • 指定某个包的函数 dplyr::summarise()
    • 移除某个包 detach(package:plyr)
  • 需要TRUE/FALSE值的地方不可以用缺少值:if得到的必须是TRUE/FALSE,你可能得到了NA
    • 在写if语句时,可以先判断一下是不是会有NA返回值:识别NaN的方法是:is.na(x)
  • as.POSIXct.numeric(value) : “origin” 一定得给值


符号的使用

基本符号

  • ( )定义函数的参数
  • ( )在运算中作为优先级
  • [ ] 用做对象的元素索引
  • { } 作为代码段落的起止
  • %in% 表示包含


  • 用分号;来分隔两个代码;
1
2
3
> 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表示该对象的第二部分;


日期格式

符号 含义 示例
%Y 2007
%y 07
%m 00~12
%d 01~31
%B January
%b Jan
%A Monday
%a Mon


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的关系图

研究设计表达式

表达式 作用 解释
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)