我有以下数据:
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; VALUE1
,VALUE2
&amp; VALUE3
是值。所以会有9个额外的列。
我可以转换每个值列&amp;然后最终合并3个数据集。任何人都可以指导我如何一步到位,没有合并?我不想合并,因为数据集很大。因此合并将效率低下。
谢谢!
答案 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