使用tidyr重塑表格
我有一个大桌子,我正试图用tidyr和它的长格式来重塑它,我想换成宽格式。桌子很大,这比我想象的要复杂 这张桌子看起来像这样使用tidyr重塑表格,r,tidyr,R,Tidyr,我有一个大桌子,我正试图用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 [...] [...]
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
目标是在每个区域获得一行宽格式的变量
比如:
到目前为止,我已经尝试过三年一次的传播和变异,但没有多大成功。您需要三个三年一次的步骤:
d %>%
gather(key, value, -Codes, -areas) %>%
unite(combined, Codes, key, sep = "") %>%
spread(combined, value)
其中d
是您的数据
要解释这些步骤,请执行以下操作:
library(tidyr)
#设置数据
d我可以用下面的方法做这件事,但它可能不是最好/最有效的
df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = '
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')
df_new <-
df %>%
gather(var_type, var_value, -areas, -Codes) %>%
mutate(var_code = paste(Codes, var_type, sep = '_')) %>%
select(-Codes, -var_type) %>%
spread(var_code, var_value)
df_new
# areas 1111_var1 1111_var2 1111_var3 1112_var1 1112_var2 1112_var3 1113_var1 1113_var2 1113_var3 1114_var1 1114_var2 1114_var3
#1 1010 2 2 34 3 7 18 20 12 11 19 11 22
#2 1020 14 19 12 10 10 13 NA NA NA NA NA NA
你能重新格式化“Like:”部分让它更清晰一点吗?David,我正在我的桌子上尝试这些步骤,但是我得到了一个到达的getOption(“max.print”)错误。我将尝试增加max.print。下面的帖子@Monduiz中有一些关于“max.print”错误的讨论,你为什么还要打印整个表格?尝试将它从dplyr转换为tbl_df(),例如,在最后一步添加%>%tbl_df()。David,它工作得非常好!非常感谢。我不知道unite。太有用了!
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
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
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)
df <- read.table(header = TRUE, stringsAsFactors = FALSE, text = '
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')
df_new <-
df %>%
gather(var_type, var_value, -areas, -Codes) %>%
mutate(var_code = paste(Codes, var_type, sep = '_')) %>%
select(-Codes, -var_type) %>%
spread(var_code, var_value)
df_new
# areas 1111_var1 1111_var2 1111_var3 1112_var1 1112_var2 1112_var3 1113_var1 1113_var2 1113_var3 1114_var1 1114_var2 1114_var3
#1 1010 2 2 34 3 7 18 20 12 11 19 11 22
#2 1020 14 19 12 10 10 13 NA NA NA NA NA NA
df %>%
gather(var_type, var_value, -areas, -Codes) %>%
unite(NewCode, Codes, var_type, sep = '') %>%
spread(NewCode, var_value)