美文网首页
42.关于separate()和unite()两个函数

42.关于separate()和unite()两个函数

作者: 心惊梦醒 | 来源:发表于2021-08-25 00:36 被阅读0次

    【上一篇:41.关于Pivoting方法整理成tidy data】
    【下一篇:43.关于缺失值】

        separate()使用正则表达式或数字位置将字符列分隔为多个列,其Usage为:

    separate(
      data,
      col,
      into,
      sep = "[^[:alnum:]]+",
      remove = TRUE,
      convert = FALSE,
      extra = "warn",
      fill = "warn",
      ...
    )
    
    • data:数据框
    • col:要分割对象的列明或列的位置,只能是单列,不能是多列。
    • into:分割后新列的名字,向量,如果想忽略某列,可以用"NA"代替
    • sep:正则表达式或整数数字向量。默认用来分割的符号是非字母数字的值。整数数字向量是1-based,表示在字符串的第几个位置分割,分割的新列个数是向量长度+1;正值表示从字符串左边开始,负值表示从字符串右边开始。
    • remove:默认为TRUE,表示从输出中删除输入列。否则保留输入列
    • convert:默认为FALSE,表示不改变新列的数据类型,默认跟输入列的数据类型一致。如果为TRUE,如果为TRUE,则会根据新列的值判断出一个适当的类型,对integer, numeric或logical很有用。
    • extra:三个候选值:"warn"、"drop"、"merge"。用于处理不同行拆分后产生的新列个数不同的情况。warn表示打印警告并扔掉多余的值(应该是从右边开始扔);drop表示不打印警告扔掉多余的值;merge表示into长度是多少就最多分割几部分,从左边开始分,into的最后一个值包含的是merge的值。
    • fill:三个候选值:"warn"、"right"、"left"。用于处理不同行拆分后产生的新列个数不同的情况。warn表示打印警告并用NA从右边开始填充;right表示用NA从右边填充;left表示用NA从左边填充。

        总结下来就是:比较规则的数据,用到data、col、into、sep、remove、convert参数就可以,解决了分割哪一列,用什么字符分割、分割后原来的列是否保留、新列的数据类型要不要重新做判断的问题;不规则的数据,也就是分割后每行的列数不相等了,就用extra、fill解决多余列到底是扔掉还是保留的问题、出现的空白列用NA填充的话是从左边还是右边填充的问题。参数并不复杂,满足了此类数据拆分的所有需求。

        应用:

    > table3
    # A tibble: 6 x 3
      country      year rate             
    * <chr>       <int> <chr>            
    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
    # 默认的sep是非字母数字的值,在本例中就是"/",等价于sep="/"
    > table3 %>% separate(rate, into = c("cases", "population"))
    # A tibble: 6 x 4
      country      year cases  population
      <chr>       <int> <chr>  <chr>     
    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
    # 注意上例中列的类型,使用convert后自动判断一个合适的类型
    > table3 %>% separate(rate, into = c("cases", "population"), convert = TRUE)
    # 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
    
    

        unite()函数的作用与separate()正好相反:合并多列到一列中。这个函数的参数比separate()少很多了:

    unite(data, col, ..., sep = "_", remove = TRUE, na.rm = FALSE)
    data:数据框
    col:是新列的名字
    ...:是要合并的列名字,用逗号依次写就好
    sep:合并用的字符
    remove:是否保留原来的列
    na.rm:是否在合并之前删除缺失值
    
    > table5
    # A tibble: 6 x 4
      country     century year  rate             
    * <chr>       <chr>   <chr> <chr>            
    1 Afghanistan 19      99    745/19987071     
    2 Afghanistan 20      00    2666/20595360    
    3 Brazil      19      99    37737/172006362  
    4 Brazil      20      00    80488/174504898  
    5 China       19      99    212258/1272915272
    6 China       20      00    213766/1280428583
    > table5 %>% unite(new, century, year, sep = "")
    # A tibble: 6 x 3
      country     new   rate             
      <chr>       <chr> <chr>            
    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
    
    

    【上一篇:41.关于Pivoting方法整理成tidy data】
    【下一篇:43.关于缺失值】

    相关文章

      网友评论

          本文标题:42.关于separate()和unite()两个函数

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