《数据科学中的R语言》学习笔记

您所在的位置:网站首页 r语言缺失值处理 《数据科学中的R语言》学习笔记

《数据科学中的R语言》学习笔记

2023-03-26 09:41| 来源: 网络整理| 查看: 265

接着上一章,我们罗列一些 tidyr 的函数。

准备工作

library(tidyverse)

1、 fill() ----- 缺失值填充

所在列的前一个值或下一个值填充缺失的值

sales % fill(year) ## # A tibble: 12 × 3 ## quarter year sales ## ## 1 Q1 2000 66013 ## 2 Q2 2000 69182 ## 3 Q3 2000 53175 ## 4 Q4 2000 21001 ## 5 Q1 2001 46036 ## 6 Q2 2001 58842 ## 7 Q3 2001 44568 ## 8 Q4 2001 50197 ## 9 Q1 2002 39113 ## 10 Q2 2002 41668 ## 11 Q3 2002 30144 ## 12 Q4 2002 52897

也可以控制填充的方向

sales %>% fill(year, .direction = "up"). ## # A tibble: 12 × 3 ## quarter year sales ## ## 1 Q1 2000 66013 ## 2 Q2 2001 69182 ## 3 Q3 2001 53175 ## 4 Q4 2001 21001 ## 5 Q1 2001 46036 ## 6 Q2 2002 58842 ## 7 Q3 2002 44568 ## 8 Q4 2002 50197 ## 9 Q1 2002 39113 ## 10 Q2 NA 41668 ## 11 Q3 NA 30144 ## 12 Q4 NA 52897

参数 direction ----- 填充缺失值的方向。默认是向下,即使用缺失值所在列的前一个值进行填充,也可以选择 direction = "up",即使用缺失值所在列的后一个值进行填充。

要注意的是,当 .data 按非数字列排序时,“up”不起作用。

2、 expand() 与 complete()

(1)expand()

指定数据框的若干列,根据其向量元素值,产生所有可能的交叉组合。

(展开SQL表以包含所有可能的值组合)

df % expand(x, y) ## # A tibble: 6 × 2 ## x y ## ## 1 1 1 ## 2 1 2 ## 3 2 1 ## 4 2 2 ## 5 3 1 ## 6 3 2

nesting() 用于限定只产生数据框已出现的组合,位于expand()函数中。

df %>% expand(nesting(x, y)) ## # A tibble: 4 × 2 ## x y ## ## 1 1 1 ## 2 1 2 ## 3 2 1 ## 4 3 2

再看一个组合(4 * 4)

df %>% expand(nesting(x, y), z) ## # A tibble: 16 × 3 ## x y z ## ## 1 1 1 4 ## 2 1 1 5 ## 3 1 1 6 ## 4 1 1 NA ## 5 1 2 4 ## 6 1 2 5 ## 7 1 2 6 ## 8 1 2 NA ## 9 2 1 4 ## 10 2 1 5 ## 11 2 1 6 ## 12 2 1 NA ## 13 3 2 4 ## 14 3 2 5 ## 15 3 2 6 ## 16 3 2 NA

(2) complete()

补全,可以看做是 expand(nesting()) + fill(),即用缺失的数据组合完成一个数据框。

df %>% complete(x, y) ## # A tibble: 6 × 3 ## x y z ## ## 1 1 1 4 ## 2 1 2 5 ## 3 2 1 NA ## 4 2 2 NA ## 5 3 1 NA ## 6 3 2 6 df %>% complete(x, y, fill = list(z = 0)) ## # A tibble: 6 × 3 ## x y z ## ## 1 1 1 4 ## 2 1 2 5 ## 3 2 1 0 ## 4 2 2 0 ## 5 3 1 0 ## 6 3 2 6

数据在complete补全的时候,会面临有两种缺失值

补位的时候造成的空缺数据原先就存在缺失值

比如

df %>% complete(x, y) ## # A tibble: 6 × 3 ## x y z ## ## 1 1 1 4 ## 2 1 2 5 ## 3 2 1 NA ## 4 2 2 NA ## 5 3 1 NA ## 6 3 2 6

就存在补位造成的空缺。

补位的时候造成的空缺

可通过 fill = list(x = 0) 控制填充

df %>% complete(x, y, fill = list(z = 0)) ## # A tibble: 6 × 3 ## x y z ## ## 1 1 1 4 ## 2 1 2 5 ## 3 2 1 0 ## 4 2 2 0 ## 5 3 1 0 ## 6 3 2 6

2. 数据原先就存在缺失值

最好通过 explicit = FALSE 显式地控制是否填充,即保留原来的缺失值。

df %>% complete(x, y, fill = list(z = 0), explicit = FALSE) ## # A tibble: 6 × 3 ## x y z ## ## 1 1 1 4 ## 2 1 2 5 ## 3 2 1 NA ## 4 2 2 0 ## 5 3 1 0 ## 6 3 2 6

参数 explicit ----- 默认为TRUE,但如果设置为FALSE,这将限制填充为隐式缺失值。

3、expand_grid() 与 crossing()

产生一个新的数据框,每行对应着向量元素的所有交叉组合,或者说,从输入的所有组合创建一个tibble。

expand_grid(x = 1:3, y = 1:2) ## # A tibble: 6 × 2 ## x y ## ## 1 1 1 ## 2 1 2 ## 3 2 1 ## 4 2 2 ## 5 3 1 ## 6 3 2

展开数据框以包含所有可能的值组合

crossing(x = 1:3, y = 1:2) ## # A tibble: 6 × 2 ## x y ## ## 1 1 1 ## 2 1 2 ## 3 2 1 ## 4 2 2 ## 5 3 1 ## 6 3 2

向量换成数据框也可以,其结果就是数据框行与元素的交叉组合

expand_grid(df = data.frame(x = 1:2, y = c(2, 1)), z = 1:3) ## # A tibble: 6 × 2 ## df$x $y z ## ## 1 1 2 1 ## 2 1 2 2 ## 3 1 2 3 ## 4 2 1 1 ## 5 2 1 2 ## 6 2 1 3

crossing() 可以看作是 expand_grid() + distinct(), 即crossing() 在完成交叉组合之后会自动去重

(distinct() ----- 保持行不同/唯一)。

比如,

expand_grid(x = c(1, 1), y = c(1:2)) # 不考虑去重 ## # A tibble: 4 × 2 ## x y ## ## 1 1 1 ## 2 1 2 ## 3 1 1 ## 4 1 2 crossing(x = c(1, 1), y = c(1:2)) # 考虑去重 ## # A tibble: 2 × 2 ## x y ## ## 1 1 1 ## 2 1 2

4、separate() 与 unite()

separate() ----- 使用正则表达式或数字位置将字符列分离为多个列

tb % unite(col = "price", c(low, high), sep = ":", remove = FALSE) ## # A tibble: 5 × 4 ## day price low high ## ## 1 1 30:45 30 45 ## 2 2 40:95 40 95 ## 3 3 89:65 89 65 ## 4 4 45:63 45 63 ## 5 5 52:42 52 42

有时候分隔符搞不定的,可以用正则表达式,将捕获的每组弄成一列

dfc % tidyr::extract( x, c("start", "end", "letter"), "(\\d+)-(\\d+)([a-z]+)", remove = FALSE ) ## # A tibble: 4 × 4 ## x start end letter ## ## 1 1-12week 1 12 week ## 2 1-10wk 1 10 wk ## 3 5-12w 5 12 w ## 4 01-05weeks 01 05 weeks

5、删除缺失值所在行 drop_na() 与 replace_na()

df % filter(!is.na(score)) ## # A tibble: 4 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Bob math 69 NA ## 3 Carol english 80 10 ## 4 Carol math 90 5

或者用 across() ----- 跨多个列应用一个(或多个)函数

df %>% filter( across(score, ~ !is.na(.x)) ) ## # A tibble: 4 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Bob math 69 NA ## 3 Carol english 80 10 ## 4 Carol math 90 5

所有列,如果有缺失值 NA,就删除所在的row

df %>% filter( across(everything(), ~ !is.na(.x)) ) ## # A tibble: 3 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Carol english 80 10 ## 3 Carol math 90 5

现在有更简便的方法

drop_na ----- 删除包含缺失值的行

df %>% drop_na() ## # A tibble: 3 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Carol english 80 10 ## 3 Carol math 90 5

也可指定某一列

df %>% drop_na(score) ## # A tibble: 4 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Bob math 69 NA ## 3 Carol english 80 10 ## 4 Carol math 90 5

没来参加考试,视为0分,可以用replace_na()

df %>% mutate(score = replace_na(score, 0)) ## # A tibble: 6 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Alice math 0 5 ## 3 Bob english 0 9 ## 4 Bob math 69 NA ## 5 Carol english 80 10 ## 6 Carol math 90 5

或者使用coalesce() ----- 找到第一个非缺失元素

df %>% mutate(score = coalesce(score, 0)) ## # A tibble: 6 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Alice math 0 5 ## 3 Bob english 0 9 ## 4 Bob math 69 NA ## 5 Carol english 80 10 ## 6 Carol math 90 5

across() 与 coalesce()一起用

df %>% mutate( across(c(score, extra), ~ coalesce(.x, 0)) ) ## # A tibble: 6 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Alice math 0 5 ## 3 Bob english 0 9 ## 4 Bob math 69 0 ## 5 Carol english 80 10 ## 6 Carol math 90 5

没来参加考试,用平均分代替

df %>% mutate( score = replace_na(score, mean(score, na.rm = TRUE)) ) ## # A tibble: 6 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Alice math 79.8 5 ## 3 Bob english 79.8 9 ## 4 Bob math 69 NA ## 5 Carol english 80 10 ## 6 Carol math 90 5

当然也可以用 if_else() 来做

df %>% mutate( score = if_else(is.na(score), mean(score, na.rm = TRUE), score) ) ## # A tibble: 6 × 4 ## name type score extra ## ## 1 Alice english 80 10 ## 2 Alice math 79.8 5 ## 3 Bob english 79.8 9 ## 4 Bob math 69 NA ## 5 Carol english 80 10 ## 6 Carol math 90 5

---------------------------------------------------------------------------------------------

以上内容来自四川师范大学王敏杰老师的研究生公选课《数据科学中的R语言》。

(王老师课程非常用心,诚意满满,强烈推荐给大家)

原地址:前言 | 数据科学中的 R 语言 (bookdown.org)

课本在这里:Welcome | R for Data Science (had.co.nz)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3