转置多列数据

时间:2018-02-14 05:33:31

标签: r

我有以下数据:

mydata <- data.frame(VAR1 = c("A",  "A",    "A",    "A",    "A",    "A",    "B",    "B",    "B",            
                              "B",  "B",    "B",    "C",    "C",    "C",    "C",    "C",    "C",            
                              "D",  "D",    "D",    "D",    "D",    "D",    "E",    "E",    "E",    "E",    "E",    "E"), 
                     VAR2 = c("A1", "A1",   "A1",   "A2",   "A2",   "A2",   "B1",   "B1",   "B1",           
                              "B2", "B2",   "B2",   "C1",   "C1",   "C1",   "C2",   "C2",   "C2",           
                              "D1", "D1",   "D1",   "D2",   "D2",   "D2",   "E1",   "E1",   "E1",   "E2",   "E2","E2"),
                     VAR3 = c("alpha",  "beta", "gamma",    "alpha",    "beta", "gamma",    "alpha",    "beta", "gamma",    "alpha",
                              "beta",   "gamma",    "alpha",    "beta", "gamma",    "alpha",    "beta", "gamma",    "alpha",    "beta",
                              "gamma",  "alpha",    "beta", "gamma",    "alpha",    "beta", "gamma",    "alpha",    "beta", "gamma"),
                     VALUE1 = c(56,  38, 83, 29, 73, 75, 99, 88, 30, 58,
                               97,  42, 64, 67, 45, 99, 62, 65, 7,  40,
                               49,  62, 82, 63, 65, 40, 45, 29, 73, 51),
VALUE2 = c(24,10,24 ,19 ,18,    6,  6,  9,  20,         
13, 5,  10, 13, 26, 13, 11, 26, 14,         
13, 15, 14, 19, 25, 22, 9,  10, 16, 17, 15, 11),
VALUE3 = c(69,  90, 91, 81, 66, 69, 76, 99,
77, 66, 88, 72, 69, 74, 85, 91,
69, 68, 73, 66, 74, 68, 90, 97,
83, 78, 88, 92, 66, 68))

我希望将此数据集转换为宽格式,值VAR3为列&amp; VALUE1VALUE2&amp; VALUE3是值。所以会有9个额外的列。

我可以转换每个值列&amp;然后最终合并3个数据集。任何人都可以指导我如何一步到位,没有合并?我不想合并,因为数据集很大。因此合并将效率低下。

谢谢!

2 个答案:

答案 0 :(得分:4)

这样的东西?

library(tidyr)
mydata %>% 
  gather(key = key, value = value, VALUE1:VALUE3) %>% 
  unite(col = key_new, VAR3, key) %>% 
  spread(key = key_new, value = value)

答案 1 :(得分:2)

使用dcast中的data.table我们可以执行此操作,而无需转换为“长”格式,因为它可能需要多个value.var

library(data.table)
dcast(setDT(mydata), VAR1 + VAR2 ~ VAR3, value.var = c('VALUE1', 'VALUE2', 'VALUE3'))

-output

# VAR1 VAR2 VALUE1_alpha VALUE1_beta VALUE1_gamma VALUE2_alpha VALUE2_beta VALUE2_gamma VALUE3_alpha VALUE3_beta VALUE3_gamma
# 1:    A   A1           56          38           83           24          10           24           69          90           91
# 2:    A   A2           29          73           75           19          18            6           81          66           69
# 3:    B   B1           99          88           30            6           9           20           76          99           77
# 4:    B   B2           58          97           42           13           5           10           66          88           72
# 5:    C   C1           64          67           45           13          26           13           69          74           85
# 6:    C   C2           99          62           65           11          26           14           91          69           68
# 7:    D   D1            7          40           49           13          15           14           73          66           74
# 8:    D   D2           62          82           63           19          25           22           68          90           97
# 9:    E   E1           65          40           45            9          10           16           83          78           88
#10:    E   E2           29          73           51           17          15           11           92          66           68