我有一个大桌子,我正在尝试使用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中传播和变异,但没有取得多大成功.
你需要三个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)