正文
【上一篇: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()函数的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()的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()两个函数】