43.关于缺失值

2021-08-26  本文已影响0人  心惊梦醒

【上一篇:42.关于separate()和unite()两个函数】
【下一篇:44.用学到的tidy data整理工具处理tidyr::who数据集】

缺失值的分类

    缺失值分为显式缺失和隐式缺失。显式缺失指的是数据中用NA代替的缺失值,隐式缺失指的是不存在于数据中的缺失值。举个例子:

> (stocks <- tibble(
     year   = c(2015, 2015, 2015, 2015, 2016, 2016, 2016),
     qtr    = c(   1,    2,    3,    4,    2,    3,    4),
     return = c(1.88, 0.59, 0.35,   NA, 0.92, 0.17, 2.66)
 ))
# A tibble: 7 x 3
   year   qtr return
  <dbl> <dbl>  <dbl>
1  2015     1   1.88
2  2015     2   0.59
3  2015     3   0.35
4  2015     4  NA   
5  2016     2   0.92
6  2016     3   0.17
7  2016     4   2.66

return列的第四行是显示缺失
year=2016,qtr=1对应的return是隐式缺失
明明tibble的结构是一个tidy data,看着也不少什么,为什么还有隐式缺失呢?
个人理解:year列和qtr列的unique values进行组合构成combination
如果combination对应的值没有用NA表示,那就是隐式缺失
隐式缺失变显示

    通过下面的变换后形成的表,似乎能理解year和qtr组合的意思了。也似乎可以理解tidy data到底是什么了。

# 分步先看一下
> stocks %>% pivot_wider(names_from = year, values_from = return)
# A tibble: 4 x 3
    qtr `2015` `2016`
  <dbl>  <dbl>  <dbl>
1     1   1.88  NA   
2     2   0.59   0.92
3     3   0.35   0.17
4     4  NA      2.66

# 最终隐式变显示的结果
> stocks %>% 
     pivot_wider(names_from = year, values_from = return) %>% 
     pivot_longer(
         cols = c(`2015`, `2016`), 
         names_to = "year", 
         values_to = "return", 
         values_drop_na = FALSE
     )
# A tibble: 8 x 3
    qtr year  return
  <dbl> <chr>  <dbl>
1     1 2015    1.88
2     1 2016   NA   
3     2 2015    0.59
4     2 2016    0.92
5     3 2015    0.35
6     3 2016    0.17
7     4 2015   NA   
8     4 2016    2.66

    还有一种方法是利用complete()函数,它的原理就是将多个变量一起找unique combination,然后用NA填充缺失的值:

# year和qtr是排列组合的对象
> stocks %>% complete(year, qtr)
# A tibble: 8 x 3
   year   qtr return
  <dbl> <dbl>  <dbl>
1  2015     1   1.88
2  2015     2   0.59
3  2015     3   0.35
4  2015     4  NA   
5  2016     1  NA   
6  2016     2   0.92
7  2016     3   0.17
8  2016     4   2.66

complete()函数的Usage很简单,通过函数的示例数据跑一下很容易理解:
complete(data, ..., fill = list())
data:数据框
...:用于组合的列名,直接用逗号隔开写就可以
fill:对于有缺少值的组合为每个变量提供一个单独的值,而不是NA。

PS:这个感觉好好用的样子!
显示缺失变隐式

    将第一个示例里的values_drop_na设为TRUE就可以了:

> stocks %>% 
     pivot_wider(names_from = year, values_from = return) %>% 
     pivot_longer(
         cols = c(`2015`, `2016`), 
         names_to = "year", 
         values_to = "return", 
         values_drop_na = TRUE
     )
# A tibble: 6 x 3
    qtr year  return
  <dbl> <chr>  <dbl>
1     1 2015    1.88
2     2 2015    0.59
3     2 2016    0.92
4     3 2015    0.35
5     3 2016    0.17
6     4 2016    2.66

PS:实际上像是删除NA行的样子
一个很有用的替换NA的函数fill()

    将NA值用最邻近的值进行替换。

treatment <- tribble(
  ~ person,           ~ treatment, ~response,
  "Derrick Whitmore", 1,           7,
  NA,                 2,           10,
  NA,                 3,           9,
  "Katherine Burke",  1,           4
)

> treatment %>% fill(person)
# A tibble: 4 x 3
  person           treatment response
  <chr>                <dbl>    <dbl>
1 Derrick Whitmore         1        7
2 Derrick Whitmore         2       10
3 Derrick Whitmore         3        9
4 Katherine Burke          1        4

fill()函数的Usage:
fill(data, ..., .direction = c("down", "up", "downup", "updown"))
data:数据框
...:变量名
.direction:填充方向。down(默认):用上方最近的非NA值填充下方的NA值;
up:用下方最近的非NA填充上方的NA值;
downup:一个非NA值上下方都有NA,则先填下方的NA再上方
updown:与downup相反

【上一篇:42.关于separate()和unite()两个函数】
【下一篇:44.用学到的tidy data整理工具处理tidyr::who数据集】

上一篇下一篇

猜你喜欢

热点阅读