美文网首页
41.关于Pivoting方法整理成tidy data

41.关于Pivoting方法整理成tidy data

作者: 心惊梦醒 | 来源:发表于2021-08-24 01:18 被阅读0次

    【上一篇:40.Tidy Data的开篇】
    【下一篇:42.关于separate()和unite()两个函数】

        上篇我用自己已知的知识在table2和table4a+table4b的基础上正确得到了rate的信息,还是比较麻烦的,本篇介绍两个函数(pivot_longer()和pivot_wider())直接将原始的数据转成tidy data。
        pivot_longer()函数增加数据的行数、减少数据的列数;pivot_wider()函数增加数据的列数、减少数据的行数。当然能用这两个函数操作的数据也是有一定特征的,并不是所有的数据都能用这两个函数。


        pivot_longer()函数适用列名字实际上是变量的值的数据,例如table4a:

    > table4a
    # A tibble: 3 x 3
      country     `1999` `2000`
    * <chr>        <int>  <int>
    1 Afghanistan    745   2666
    2 Brazil       37737  80488
    3 China       212258 213766
    > pivot_longer(table4a,!country,names_to="year",values_to = "cases")
    # A tibble: 6 x 3
      country     year   cases
      <chr>       <chr>  <int>
    1 Afghanistan 1999     745
    2 Afghanistan 2000    2666
    3 Brazil      1999   37737
    4 Brazil      2000   80488
    5 China       1999  212258
    6 China       2000  213766
    
    pivot_longer()适用的数据格式

        pivot_longer()函数的Usage如下,这个函数的中重要及常用参数都很好理解,看看帮助文档运行下示例就能理解:

    pivot_longer(
      data,
      cols,
      names_to = "name",
      names_prefix = NULL,
      names_sep = NULL,
      names_pattern = NULL,
      names_ptypes = list(),
      names_transform = list(),
      names_repair = "check_unique",
      values_to = "value",
      values_drop_na = FALSE,
      values_ptypes = list(),
      values_transform = list(),
      ...
    )
    
    data:数据框。
    cols:用来做转换的列,上例中!country表示处理country之外的其他列,等价于c(`1999`,`2000`)。
    names_to:指定要创建的变量的名字,上例中1999,2000要变到year列。
            可以是字符串,也可以是向量(表示要创建多列,与names_sep或names_pattern一起使用)。
    names_prefix:可以用这个参数去掉用来做转换的列的列名的前缀。例如,
        如果上例中设置names_prefix="1",则year列里的值会是999,2000。
    names_sep:如果names_to对应多个值,则这个参数控制列名的拆分方式。例如,
    cols的值为"n1_a","n2_b","n3_c",names_to=c("nvalue","alphabeta"),names_sep="_"
    names_pattern:匹配模式,用括号进行分组,例如,要转换的列名格式为new_sp_m014
           names_to = c("a", "b", "c"), names_pattern = "new_?(.*)_(.)(.*)"
           则第一个括号匹配到p,第二个括号匹配到m,第三个匹配到014
    names_ptypes:待补充
    names_transform:待补充
    names_repair:待补充
    values_to:要转换列的值变成一列后的列名,上例中是cases
    values_drop_na:TRUE的话,包含NA的行最后会去掉
    values_ptypes:待补充
    values_transform:待补充
    

        pivot_wider()函数适用变量对应的值实际上是多个变量的数据,与pivot_longer()正好是相反的。例如table2:

    > table2
    # A tibble: 12 x 4
       country      year type            count
       <chr>       <int> <chr>           <int>
     1 Afghanistan  1999 cases             745
     2 Afghanistan  1999 population   19987071
     3 Afghanistan  2000 cases            2666
     4 Afghanistan  2000 population   20595360
     5 Brazil       1999 cases           37737
     6 Brazil       1999 population  172006362
     7 Brazil       2000 cases           80488
     8 Brazil       2000 population  174504898
     9 China        1999 cases          212258
    10 China        1999 population 1272915272
    11 China        2000 cases          213766
    12 China        2000 population 1280428583
    > pivot_wider(table2,names_from = type, values_from = count)
    # A tibble: 6 x 4
      country      year  cases population
      <chr>       <int>  <int>      <int>
    1 Afghanistan  1999    745   19987071
    2 Afghanistan  2000   2666   20595360
    3 Brazil       1999  37737  172006362
    4 Brazil       2000  80488  174504898
    5 China        1999 212258 1272915272
    6 China        2000 213766 1280428583
    
    pivot_wider()适用的数据格式

        pivot_wider()的Usage如下:先掌握重要参数就足够了。

    pivot_wider(
      data,
      id_cols = NULL,
      names_from = name,
      names_prefix = "",
      names_sep = "_",
      names_glue = NULL,
      names_sort = FALSE,
      names_repair = "check_unique",
      values_from = value,
      values_fill = NULL,
      values_fn = NULL,
      ...
    )
    
    data:数据框
    id_cols:默认是除了names_from和values_from指定的列之外的其他列
             当要变的列的值与已存在的变量名有冲突的时候特别有用
    names_from:指明从哪些列获取(新)变量的名字
    names_prefix:添加到每个变量名开头的字符串。如果names_from是一个数字向量,
                  并且您想要创建语法变量名,那么这一点特别有用。
    names_sep:如果names_from或values_from包含多个变量,
               这将用于将它们的值连接到一个单独的字符串,用作列名。
               看函数帮助中的一个例子之后就很清楚了
    names_glue:待补充
    names_sort:如果为FALSE,默认按出现的顺序排列
    names_repair:待补充
    values_from:指明新列的值来自哪些列
    values_fill:转换后发现某些地方缺少值,就用这个参数指定一个值进行填充,
                 也可以实现对不同列用不同值填充
    values_fn:指定一个函数,对值进行计算后返回
    

        先记住有这样的函数,待用到的时候再仔细研究也是可以的,毕竟参数也不难,基本看函数的示例数据后就可以解决大部分了。

    【上一篇:40.Tidy Data的开篇】
    【下一篇:42.关于separate()和unite()两个函数】

    另一种实现方法见:【1.Tidy Data的获得与转换(数据的融合与重塑)】

    相关文章

      网友评论

          本文标题:41.关于Pivoting方法整理成tidy data

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