6.5 separate() and untie()

separate()untie() 函数则是为了解决以下问题:多个变量挤在了同一列中,或者一个变量分散到了不同列中。

6.5.1 separate()

table3 中,rate 同时包含了 casespopulation 两个变量,我们需要把它拆分(separate)为两列,separate() 函数可以将这一混杂的列拆分成多个变量,它包含以下四个主要参数:
* data: 需要调整的数据框
* col: 需要进行拆分的列的列名
* into: 拆分后新生成变量的列名,格式为字符串向量
* sep: 对如何拆分原变量的描述,其可以是正则表达式,如 _ 表示通过下划线拆分,或 [^a-z] 表示通过任意非字符字母拆分,或一个指定位置的整数。默认情况下,sep将认定一个非字符字母进行划分

整理的图示:

注意,以上输出的tibble中,casespopulation被设定为字符串类型,使用convert = T将其转换为数值变量

A seemingly similar function tidyr::separate_rows() separate existing columns based on sep, and then breaks each component into new rows, instead of columns:

The multiple choice data mentioned in 6.3.2 can easily be solved when using separate_rows():

6.5.2 unite()

unite()separate() 的逆运算——它可以将多列合并为一列. 在 table5 中,原来的 year 变量被拆成了两个列,可以用 unite(),只需要指定要合并后的列名和要合并的列。默认情况下,新列中将用_分隔符

sep = "" 可以取消分隔符:

整理的图示:

6.5.3 Exercises

Exercise 6.4 separate()中的extrafill参数的作用是什么?用下面两个数据框进行实验:

extra 用来告诉 separate() 函数如何处理分列过程中多出来的元素(too many pieces,即 into 指定的列数小于原数据中某行可分的元素个数),fill 负责如何处理元素不够的情况(not enough pieces,即into指定的列数大于原数据中某行可分的元素个数)。默认情况下,extra = "drop"separate() 将丢弃多余的元素,并生成一条警告信息:

extra = "merge"将把多余的元素和前一个元素当做一个整体:

对于元素过少的情况,默认的fill = "warn"将会用NA进行填充,但会生成一条警告。fill = "right"会尽可能让靠左的列拥有可用的元素,用NA填充右边的列;fill = "left"正好相反。这两种手动设置都不会产生warning:

2.unite()separate()均有一个remove参数,它的作用是什么?
remove控制是否在unite()separate()输出的数据框中保留原来的列,默认remove = T。如果想保留原来未合并/分离的格列,可以设置remove = F

Exercise 6.5 探究 tidyr 中一个与 separate() 类似的函数 extract() 的用法

separate()函数的分列操作是基于参数 sep 的,无论是给 sep 传入字符串指定分隔符,还是用数值指定分隔的位置,separate() 必须要有一个分隔符才能正常运作(可以把sep = n看做第 n 个和第 n+1 个元素之间的一个空白分隔符)
extract()用一个正则表达式regex描述要分隔的列col中存在的模式,在正则表达式中的每个子表达式(用()定义)将被认为是into中的一个元素,因此,extract()separate()使用起来更加广泛灵活。例如下面的数据集无法用separate()分列,因为无法用一个各行的分隔符(的位置)不一样,但用extract()中的正则表达式就很简单:

适当设计regex,实现的效果可以与设置sep完全一致: