接上篇!

library(dplyr)

6 替换/重编码

替换/重编码操作是对数据框中的部分元素进行改动。

  • recode函数用于原子向量中的元素替换

文本型元素的替换:

txt <- c(LETTERS[1:3], 1:2)
txt
## [1] "A" "B" "C" "1" "2"

recode(txt, "A" = "Apple", "B" = "Big")
## [1] "Apple" "Big"   "C"     "1"     "2"

recode(txt, "1" = "10")
## [1] "A"  "B"  "C"  "10" "2"

数值型元素的替换:

num <- c(1:5)
recode(num, `5` = 50L)
## [1]  1  2  3  4 50
  • recode_factor在替换后将原子向量转为因子类型

recode_factor(num, `5` = 50L)
## [1] 1  2  3  4  50
## Levels: 50 1 2 3 4
  • na_if函数用于将元素替换成缺失值NA

na_if(x, y)
  • x:原子向量

  • y:待替换的元素或向量。

参数y的长度为1时:

x <- c(1:5)
na_if(x, 4)
## [1]  1  2  3 NA  5

参数y的长度与参数x相等时,二者对应位置的元素相等时替换成NA

y <- c(5:1)
na_if(x, y)
## [1]  1  2 NA  4  5
  • coalesce用于替换缺失值NA

x <- c(1:3, NA, 5:6, NA)
coalesce(x, 4)
## [1] 1 2 3 4 5 6 4
y <- 1:7
coalesce(x, y)
## [1] 1 2 3 4 5 6 7

7 数学运算

R语言中的数学运算函数已由basestats工具包提供,dplyr中的函数只是对其做了一些补充。

  • cummean函数为累平均运算

x <- 1:6
cummean(x)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5
  • base包中有cumsumcummancummin等函数。

  • cumall函数为all函数的累加形式

all(x < 5)
## [1] FALSE
cumall(x < 5)
## [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE
  • cumany函数为any函数的累加形式

any(x > 5)
## [1] TRUE
cumany(x >= 5)
## [1] FALSE FALSE FALSE FALSE  TRUE  TRUE
  • lag函数计算数据序列的滞后值

x <- 1:6
lag(x)
## [1] NA  1  2  3  4  5
lag(x, n = 2L)
## [1] NA NA  1  2  3  4
  • lead函数计算数据序列的前进值

lead(x)
## [1]  2  3  4  5  6 NA
lead(x, n = 2L)
## [1]  3  4  5  6 NA NA
  • intersectunionsetdiff函数分别用于计算交集、并集、补集

x <- c(1,2,4,6)
y <- c(2:7)
intersect(x, y)
## [1] 2 4 6
union(x, y)
## [1] 1 2 4 6 3 5 7
setdiff(y, x)
## [1] 3 5 7
  • union_all函数取交集时不剔除重复值,相当于向量合并

union_all(x, y)
##  [1] 1 2 4 6 2 3 4 5 6 7

8 提取

提取操作是根据索引index提取向量中的元素或数据框中的变量。

  • firstlast函数分别用于提取第一个和最后一个元素

x <- c(5, 1, 3, 2, 2, NA)
first(x)
last(x)
  • nth函数用于提取第n个元素

nth(x, n = 3)
  • pull函数用于提取数据框的某个变量

pull(.data, var = -1, name = NULL, ...)

默认提取最后一个变量:

pull(mtcars)

参数var根据变量顺序进行提取,正数表示从前往后,负数表示从后往前:

pull(mtcars, var = 2)
pull(mtcars, var = -2)

参数name根据变量名提取,参数名可省略:

pull(mtcars, name = disp)
pull(mtcars, disp)

9 条件判断

这类函数主要是对逻辑运算的代码进行简化。

  • between函数判断数值是否在某闭区间内

between(x, left, right)
between(1:5, 2, 4)
## [1] FALSE  TRUE  TRUE  TRUE FALSE
  • setequal函数用于判断数值是否相等

setequal(5, 5)
## [1] TRUE
setequal(pi, 3.14)
## [1] FALSE
  • near函数用于判断数值是否近似相等

near(pi, 3.14, tol = 0.01)
## [1] TRUE
near(pi, 3.14, tol = 0.001)
## [1] FALSE
  • if_else函数是if-else条件句的简化版,对标于base包中的ifelse函数

if_else(1:5 < 3, 0, 1)
## [1] 0 0 1 1 1
  • case_when函数是多重if条件句的简化版

该函数越靠前的条件优先级越高,即后续条件不会改变前面条件的结果。

x <- c(1:20)
case_when(
  x %% 3 == 0 ~ "3的倍数",
  x %% 2 == 0 ~ "偶数",
  x %% 2 == 1 ~ "奇数"
)
##  [1] "奇数"    "偶数"    "3的倍数" "偶数"    "奇数"    "3的倍数" "奇数"   
##  [8] "偶数"    "3的倍数" "偶数"    "奇数"    "3的倍数" "奇数"    "偶数"   
## [15] "3的倍数" "偶数"    "奇数"    "3的倍数" "奇数"    "偶数"

10 环境函数

由于在使用管道操作符%>%编写代码时,中间过程没有新的环境变量生成,因此不能直接对其引用,这时可以使用dplyr工具包中的环境函数加以指代。

  • n:当前分组的样本个数

  • cur_data:当前数据框,不包含分类(组)变量

  • cur_data_all:当前数据框,包含分类(组)变量

  • cur_group:当前分类(组)变量

  • cur_group_id:当前分组的序号编码

  • cur_group_rows:当前的行序号

  • cur_column:当前列名,仅在across函数内使用

dta <- group_by(mtcars, cyl)
dta %>% summarise(data = list(cur_data()))
## # A tibble: 3 x 2
##     cyl data              
## * <dbl> <list>            
## 1     4 <tibble [11 x 10]>
## 2     6 <tibble [7 x 10]> 
## 3     8 <tibble [14 x 10]>
dta %>% mutate(var = list(cur_group()))
## # A tibble: 32 x 12
## # Groups:   cyl [3]
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb var        
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <list>     
##  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4 <tibble [1~
##  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4 <tibble [1~
##  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1 <tibble [1~
##  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1 <tibble [1~
##  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2 <tibble [1~
##  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1 <tibble [1~
##  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4 <tibble [1~
##  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2 <tibble [1~
##  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2 <tibble [1~
## 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4 <tibble [1~
## # ... with 22 more rows
dta %>% mutate(var = mpg * cur_group_rows())
## # A tibble: 32 x 12
## # Groups:   cyl [3]
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb   var
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4  21  
##  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4  42  
##  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1  68.4
##  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1  85.6
##  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2  93.5
##  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1 109. 
##  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4 100. 
##  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2 195. 
##  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2 205. 
## 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4 192  
## # ... with 22 more rows

往期推荐阅读:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐