我想从长到宽投射数据,但将变量显示为行而不是列
数据集:
df1 <- data.frame(Area = c('a', 'a', 'b', 'b', 'c', 'c'),
Period =c(1,2,1,2,1,2),
var1 = c(1,2,3,4,5,6),
var2 = c(7,8,9,10,11,12),
var3 = c(13,14,15,16,17,18)
)
Area Period var1 var2 var3
1 a 1 1 7 13
2 a 2 2 8 14
3 b 1 3 9 15
4 b 2 4 10 16
5 c 1 5 11 17
6 c 2 6 12 18
我想去:
Period
Area 1 2
a Var1
a Var2
a Var3
b Var1
b Var2
b Var3
我尝试过dcast并设法获得:
df1 = dcast(setDT(df1), Area ~ Period ,sum, value.var=c("var1", "var2", "var3"))
Area var1_1 var1_2 var2_1 var2_2 var3_1 var3_2
1 a 1 2 7 8 13 14
2 b 3 4 9 10 15 16
3 c 5 6 11 12 17 18
..但这不是我真正追求的。任何帮助将不胜感激!
答案 0 :(得分:2)
首先融合为长格式,然后重新铸造为宽
library( data.table )
dcast(
melt( setDT(df1),
id.vars = c("Area", "Period"),
measure.vars = patterns( var = "^var") ),
Area + variable ~ Period,
value.var = "value" )
# Area variable 1 2
# 1: a var1 1 2
# 2: a var2 7 8
# 3: a var3 13 14
# 4: b var1 3 4
# 5: b var2 9 10
# 6: b var3 15 16
# 7: c var1 5 6
# 8: c var2 11 12
# 9: c var3 17 18
答案 1 :(得分:1)
使用dplyr
和tidyr
,您可以执行以下操作:
df1 %>%
pivot_longer(-c(1:2)) %>%
pivot_wider(names_from = Period, values_from = value)
Area name `1` `2`
<fct> <chr> <dbl> <dbl>
1 a var1 1 2
2 a var2 7 8
3 a var3 13 14
4 b var1 3 4
5 b var2 9 10
6 b var3 15 16
7 c var1 5 6
8 c var2 11 12
9 c var3 17 18