高级包:字符串长度/分割/子集/替换,数据框排序/去重/修改/选择,apply族函数,数据框长宽转换

字符串操作 stringr

  1. str_length(...):返回字符串中有多少字符。如果输入一个向量,则返回一个等长的数字向量,依次对应其字符数。
    • length(...):用于计算一个向量、列表等中的元素个数,不能返回字符串的字符数量。
  2. str_split(string, pattern, n = Inf, simplify = F):将pattern解释为正则表达式,n作为返回字符串片段的最大值,进行分割。当simplify = F时,返回一个包含了字符串向量的列表;当simplify = T时,返回一个字符串矩阵。
  3. 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
  4. str_detect(string, pattern, negate = F):返回一个与string向量等长的逻辑向量,如果string向量中的元素可以与pattern匹配,则相应的逻辑向量为True,否则为False。如果negate = T时,返回的逻辑向量将反转(T变F,F变T)。
    衍生出两种函数:
    1. str_starts(同上):开头匹配。
    2. str_ends(同上):结尾匹配。
  5. str_replace(string, pattern, replacement):替换首个。
    1. str_replace_all(同上):替换全部。
  6. str_remove(string, pattern):将pattern解释为正则表达式,去除字符串中的首个匹配。同理有str_remove_all(同上)

R正则表达式

49 正则表达式 | R语言教程

数据框操作 dplyr

  1. 排序:arrange(.data, 排序列, .by_group = F)
    • 与对向量排序的sort()不同,arrange()对数据框排序。
    1. .data:可使用data %>% ...
    2. 排序列/列向量:要正序排序的列,使用desc()以倒序排序。
      • 多列排序:arrange(.data, col1, col2, ...)
    3. .by_group = T时,将按照分组变量进行排序,此参数仅对被group_by()处理过的数据框生效。
  2. 去重:distinct(.data, 使唯一列, .keep_all = F)
    • 对向量去重使用uniqueduplicated,后者返回等长的逻辑向量。
    1. 使唯一列:要使哪些列唯一,如果省略,则使用所有列。
      • 使多个列唯一:distinct(.data, col1, col2, ...)
    2. .keep_all = F:是否要显示其他不相关的列,如果为F,则只显示使唯一列/列向量;如果为T,则显示全部列。
  3. 新增/删除列:mutate(.data , 表达式)
    1. 表达式形如:new_col_name = col1 * col2
    2. 注意,函数产生的是返回值,需要将变量赋值以储存结果。
    3. 除了所示的参数外,还有一些参数可以分组,控制输出时保留的列,以及控制新列插入的位置。
  4. 选择列:select
    1. 非常方便,提供了左列名:右列名之类的方便操作,配合selection helpers(见dplyr tidy evaluation的参考),你能想到的,它几乎都能实现。
  5. 选择行:filter
    1. 似乎没有特别引入注目的点,但要注意,当条件返回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函数中使用。)

Programming with dplyr (tidy evaluation)

管道 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()
    

流程控制

  1. if-else:if (...) {...} else if (...) {...} else {...}
  2. ifelse(test, yes_return_value, no_return_value)test是逻辑值或逻辑向量。如果test中的逻辑值为T,则将对应的元素赋值为yes_return_value,否则,赋值为no_return_value。返回与test形状相同的值、向量或矩阵。
    1. ifelse函数可以与str_detect函数联用:先用str_detect函数检测某向量中元素是否含有目标字符串,如果含有,则为T,最终返回一个逻辑向量;ifelse则根据该逻辑向量,统一赋值,以将向量中无用的部分除去并统一命名。
  3. dplyr::case_when
    case_when( 
        i > 0 ~ '+',
        i < 0 ~ '-',
        T ~ '0'   
    )
    
  4. for循环:
    for (i in seq) { ... }
    

apply族函数

apply(df/matrix, margin, func)

  1. margin:对于矩阵和数据框,1代表行,2代表列。
  2. 注意,func不应带有括号,即sum不应写为sum(),因为此处需要一个函数对象,而不是函数的返回值。行或列向量将传入函数的第一个参数。
  3. apply会将每次计算的结果按列排列(竖起来排)。假设func = function(x) { c(mean = mean(x), sd = sd(x)) },则,apply计算第一行或列时,将结果以一个2行1列的矩阵存储(行名为mean和sd),第二次计算时,则变为2行2列…

lapply(vector/list, func):list apply

  1. 只接受列表或向量,否则,将会尝试用as.list转化。

sapply (simplified lapply):sapply 函数与 lapply 类似,但会尝试简化结果。如果结果是一个列表,且列表的每个元素都是长度为1的向量,那么 sapply 会将结果转换为一个向量。

vapply (verified lapply):允许指定结果的类型和长度。如果结果与指定的类型和长度不匹配,vapply 会产生一个错误。

tapply (table apply):对向量的子集(分组)应用一个函数,其中子集(分组)是由另一个向量或因子(分组因子)定义的。

数据框的连接

  1. 内连接:inner_join(x, y, by = join_by(xx == yy), na_matches, relationship, 略)
  2. 左连接:left_join(同上)
  3. 右连接:right_join(同上)
  4. 外连接:full_join(同上)

数据框的长格式与宽格式转换

  • 宽格式:数据框中的数据元素必须同时根据行名和列名来确定其意义。
  • 长格式:数据框中的数据元素仅需其所在行的信息即可确定其意义。宽格式转为长格式时,常增加行数(变长)。
  • pivot系列函数是spread()gather()的升级版本,改进了函数名称和参数的可记忆性。
  1. 宽格式转为长格式: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

Pivoting (艰涩)


感谢生信技能树课程

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值