美文网首页
43.关于缺失值

43.关于缺失值

作者: 心惊梦醒 | 来源:发表于2021-08-26 00:02 被阅读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数据集】

    相关文章

      网友评论

          本文标题:43.关于缺失值

          本文链接:https://www.haomeiwen.com/subject/iwbriltx.html