专栏名称: 心惊梦醒
学习着学会生活~
目录
相关文章推荐
科普中国  ·  兵马俑发掘,有大发现! ·  4 天前  
生命的智慧  ·  Science | 珊瑚礁恢复的进展 ·  6 天前  
51好读  ›  专栏  ›  心惊梦醒

41.关于Pivoting方法整理成tidy data

心惊梦醒  · 简书  ·  · 2021-08-24 01:18

正文

【上一篇: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()适用的数据格式

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()适用的数据格式

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()两个函数】