美文网首页
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