【上一篇: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
网友评论