字符串操作 stringr
str_length(...)
:返回字符串中有多少字符。如果输入一个向量,则返回一个等长的数字向量,依次对应其字符数。length(...)
:用于计算一个向量、列表等中的元素个数,不能返回字符串的字符数量。
str_split(string, pattern, n = Inf, simplify = F)
:将pattern
解释为正则表达式,n
作为返回字符串片段的最大值,进行分割。当simplify = F
时,返回一个包含了字符串向量的列表;当simplify = T
时,返回一个字符串矩阵。str_sub(string, start = 1, end = -1)
(该函数中-1
为倒数第1位字符的意思):提取字符串 [ s t a r t , e n d ] [start, end] [start,end]。- start和end也可为数字向量,分别代表一组开始值和一组结束值,并依次配对。
- string也可为字符串向量,但若start和end也为向量时,需改用
str_sub_all
。
str_detect(string, pattern, negate = F)
:返回一个与string向量等长的逻辑向量,如果string向量中的元素可以与pattern匹配,则相应的逻辑向量为True,否则为False。如果negate = T
时,返回的逻辑向量将反转(T变F,F变T)。
衍生出两种函数:str_starts(同上)
:开头匹配。str_ends(同上)
:结尾匹配。
str_replace(string, pattern, replacement)
:替换首个。str_replace_all(同上)
:替换全部。
str_remove(string, pattern)
:将pattern
解释为正则表达式,去除字符串中的首个匹配。同理有str_remove_all(同上)
。
R正则表达式
数据框操作 dplyr
- 排序:
arrange(.data, 排序列, .by_group = F)
- 与对向量排序的
sort()
不同,arrange()
对数据框排序。
.data
:可使用data %>% ...
。排序列/列向量
:要正序排序的列,使用desc()
以倒序排序。- 多列排序:
arrange(.data, col1, col2, ...)
。
- 多列排序:
.by_group = T
时,将按照分组变量进行排序,此参数仅对被group_by()
处理过的数据框生效。
- 与对向量排序的
- 去重:
distinct(.data, 使唯一列, .keep_all = F)
- 对向量去重使用
unique
或duplicated
,后者返回等长的逻辑向量。
使唯一列
:要使哪些列唯一,如果省略,则使用所有列。- 使多个列唯一:
distinct(.data, col1, col2, ...)
。
- 使多个列唯一:
.keep_all = F
:是否要显示其他不相关的列,如果为F
,则只显示使唯一列/列向量
;如果为T
,则显示全部列。
- 对向量去重使用
- 新增/删除列:
mutate(.data , 表达式)
- 表达式形如:
new_col_name = col1 * col2
。 - 注意,函数产生的是返回值,需要将变量赋值以储存结果。
- 除了所示的参数外,还有一些参数可以分组,控制输出时保留的列,以及控制新列插入的位置。
- 表达式形如:
- 选择列:
select
- 非常方便,提供了
左列名:右列名
之类的方便操作,配合selection helpers(见dplyr tidy evaluation的参考)
,你能想到的,它几乎都能实现。
- 非常方便,提供了
- 选择行:
filter
- 似乎没有特别引入注目的点,但要注意,当条件返回
NA
时,filter
会丢弃该行;而使用data[表达式]
时,若有表达式出现了NA
,则该行都将被替换为NA
。
- 似乎没有特别引入注目的点,但要注意,当条件返回
dplyr tidy evaluation
- 大多数dplyr函数使用整洁评估(tidy evaluation),在大多数(不是全部)的基本R函数中,需要使用
$
来引用数据变量,但在dplyr函数中,可以不经引用,直接输入列名(非字符串)来引用。 - (要在自定义函数给dplyr函数传参,如果参数为未定义的列变量名,可以使用
{{col_name(传参)}}
的形式传递参数,自定义函数的使用:func(.data, col_name(非字符串形式))
;如果参数为字符串形式,则可使用.data[[col_name(传参)]]
的形式传递参数,其中.data[[string]]
可以将列名(字符串)解析为列变量名,此外data[[string]] (注意这里的data没有'.')
的形式也可以在非dplyr函数中使用。)
管道 dplyr/magrittr
- 该操作符由
magrittr
包定义,并在dplyr
中广泛使用,因此,要使用该运算符,必须先导入dplyr/magrittr
包。 - 使用时,所有函数均可使用(不限制在包内函数)。该操作符的作用是将运算符的左侧 传递给 运算符右侧的第一个参数(默认)。详细信息需查询
magrittr
包中的%>%
。 - 示例:
x1 = select(iris, -5) ; x2 = as.matrix(x1) ; x3 = head(x2, 50) pheatmap(x3) ↓↓↓ iris %>% select(-5) %>% as.matrix() %>% head(50) %>% pheatmap()
流程控制
- if-else:
if (...) {...} else if (...) {...} else {...}
ifelse(test, yes_return_value, no_return_value)
:test
是逻辑值或逻辑向量。如果test
中的逻辑值为T
,则将对应的元素赋值为yes_return_value
,否则,赋值为no_return_value
。返回与test
形状相同的值、向量或矩阵。ifelse
函数可以与str_detect
函数联用:先用str_detect
函数检测某向量中元素是否含有目标字符串,如果含有,则为T,最终返回一个逻辑向量;ifelse
则根据该逻辑向量,统一赋值,以将向量中无用的部分除去并统一命名。
dplyr::case_when
:case_when( i > 0 ~ '+', i < 0 ~ '-', T ~ '0' )
- for循环:
for (i in seq) { ... }
apply族函数
apply(df/matrix, margin, func)
:
margin
:对于矩阵和数据框,1代表行,2代表列。- 注意,
func
不应带有括号,即sum
不应写为sum()
,因为此处需要一个函数对象,而不是函数的返回值。行或列向量将传入函数的第一个参数。 - apply会将每次计算的结果按列排列(竖起来排)。假设
func = function(x) { c(mean = mean(x), sd = sd(x)) }
,则,apply计算第一行或列时,将结果以一个2行1列的矩阵存储(行名为mean和sd),第二次计算时,则变为2行2列…
lapply(vector/list, func)
:list apply
- 只接受列表或向量,否则,将会尝试用
as.list
转化。
sapply
(simplified lapply):sapply
函数与 lapply
类似,但会尝试简化结果。如果结果是一个列表,且列表的每个元素都是长度为1的向量,那么 sapply
会将结果转换为一个向量。
vapply
(verified lapply):允许指定结果的类型和长度。如果结果与指定的类型和长度不匹配,vapply
会产生一个错误。
tapply
(table apply):对向量的子集(分组)应用一个函数,其中子集(分组)是由另一个向量或因子(分组因子)定义的。
数据框的连接
- 内连接:
inner_join(x, y, by = join_by(xx == yy), na_matches, relationship, 略)
- 左连接:
left_join(同上)
- 右连接:
right_join(同上)
- 外连接:
full_join(同上)
数据框的长格式与宽格式转换
- 宽格式:数据框中的数据元素必须同时根据行名和列名来确定其意义。
- 长格式:数据框中的数据元素仅需其所在行的信息即可确定其意义。宽格式转为长格式时,常增加行数(变长)。
pivot
系列函数是spread()
和gather()
的升级版本,改进了函数名称和参数的可记忆性。
- 宽格式转为长格式:
pivot_longer(data, cols = 需重塑的列/列向量, names_to = 使用列名创建的变量的名称, values_to = 使用数据元素创建的变量的名称)
######### 原始数据
relig_income
#> # A tibble: 18 × 11
#> religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k` `$75-100k`
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Agnostic 27 34 60 81 76 137 122
#> 2 Atheist 12 27 37 52 35 70 73
#> 3 Buddhist 27 21 30 34 33 58 62
#> 4 Catholic 418 617 732 670 638 1116 949
#> 5 Don’t k. 15 14 15 11 10 35 21
######### 转为长格式后
relig_income %>%
pivot_longer(
cols = !religion,
names_to = "income", # 将列名转为'income'列
values_to = "count" # 将数据元素转为'count'列
)
#> # A tibble: 180 × 3
#> religion income count
#> <chr> <chr> <dbl>
#> 1 Agnostic <$10k 27
#> 2 Agnostic $10-20k 34
#> 3 Agnostic $20-30k 60
#> 4 Agnostic $30-40k 81
#> 5 Agnostic $40-50k 76
感谢生信技能树课程