当前位置:  开发笔记 > 编程语言 > 正文

使用tidyr重塑表格

如何解决《使用tidyr重塑表格》经验,为你挑选了1个好方法。

我有一个大桌子,我正在尝试使用tidyr和它的长格式重塑,我想改成宽格式.桌子很大,这比我想象的要复杂得多.

该表看起来像这样

Codes      areas  var1  var2  var3
1111       1010    2      2    34
1112       1010    3      7    18
1113       1010    20     12   11
1114       1010    19     11   22
[...]      [...]   [...]  [...]  [...]
1111       1020    14     19   12
1112       1020    10     10   13

目标是使用宽格式的变量获得每个区域一行.

喜欢:

Area  1111Var1 1111Var2 111Var3 1112Var1 1112Var2 1112Var3
1010    2         2        34      3       7        18

到目前为止,我已尝试在tidyr中传播和变异,但没有取得多大成功.



1> David Robins..:

你需要三个tidyr步骤:

d %>%
  gather(key, value, -Codes, -areas) %>%
  unite(combined, Codes, key, sep = "") %>%
  spread(combined, value)

d你的数据在哪里?


解释步骤:

library(tidyr)

# setting up data
d <- readr::read_delim("Codes areas var1 var2 var3
1111 1010 2 2 34
1112 1010 3 7 18
1113 1010 20 12 11
1114 1010 19 11 22
1111 1020 14 19 12
1112 1020 10 10 13", delim = " ")

首先,您需要收集var1,var2,var3列:

d %>%
  gather(key, value, -Codes, -areas)
#> Source: local data frame [18 x 4]
#> 
#>    Codes areas    key value
#>    (int) (int) (fctr) (int)
#> 1   1111  1010   var1     2
#> 2   1112  1010   var1     3
#> 3   1113  1010   var1    20
#> 4   1114  1010   var1    19
#> 5   1111  1020   var1    14
#> 6   1112  1020   var1    10
#> 7   1111  1010   var2     2
#> 8   1112  1010   var2     7
#> 9   1113  1010   var2    12
#> 10  1114  1010   var2    11
#> 11  1111  1020   var2    19
#> 12  1112  1020   var2    10
#> 13  1111  1010   var3    34
#> 14  1112  1010   var3    18
#> 15  1113  1010   var3    11
#> 16  1114  1010   var3    22
#> 17  1111  1020   var3    12
#> 18  1112  1020   var3    13

然后Codes使用tidyr 将它们与列组合unite:

d %>%
  gather(key, value, -Codes, -areas) %>%
  unite(combined, Codes, key, sep = "")
#> Source: local data frame [18 x 3]
#> 
#>    combined areas value
#>       (chr) (int) (int)
#> 1  1111var1  1010     2
#> 2  1112var1  1010     3
#> 3  1113var1  1010    20
#> 4  1114var1  1010    19
#> 5  1111var1  1020    14
#> 6  1112var1  1020    10
#> 7  1111var2  1010     2
#> 8  1112var2  1010     7
#> 9  1113var2  1010    12
#> 10 1114var2  1010    11
#> 11 1111var2  1020    19
#> 12 1112var2  1020    10
#> 13 1111var3  1010    34
#> 14 1112var3  1010    18
#> 15 1113var3  1010    11
#> 16 1114var3  1010    22
#> 17 1111var3  1020    12
#> 18 1112var3  1020    13

现在 spread将工作:

d %>%
  gather(key, value, -Codes, -areas) %>%
  unite(combined, Codes, key, sep = "") %>%
  spread(combined, value)
#> Source: local data frame [2 x 13]
#> 
#>   areas 1111var1 1111var2 1111var3 1112var1 1112var2 1112var3 1113var1
#>   (int)    (int)    (int)    (int)    (int)    (int)    (int)    (int)
#> 1  1010        2        2       34        3        7       18       20
#> 2  1020       14       19       12       10       10       13       NA
#> Variables not shown: 1113var2 (int), 1113var3 (int), 1114var1 (int),
#>   1114var2 (int), 1114var3 (int)


@Monduiz为什么你还需要打印整张桌子?尝试将其从dplyr转换为tbl_df(),例如通过将%>%tbl_df()添加到最后一步.
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有