以下是此示例的玩具数据集:
data <- data.frame(x=rep(c("red","blue","green"),each=4), y=rep(letters[1:4],3), value.1 = 1:12, value.2 = 13:24)
x y value.1 value.2
1 red a 1 13
2 red b 2 14
3 red c 3 15
4 red d 4 16
5 blue a 5 17
6 blue b 6 18
7 blue c 7 19
8 blue d 8 20
9 green a 9 21
10 green b 10 22
11 green c 11 23
12 green d 12 24
如何投射或传播变量y,以产生以下宽数据.frame:
x a.value.1 b.value.1 c.value.1 d.value.1 a.value.2 b.value.2 c.value.2 d.value.2
1 blue 5 6 7 8 17 18 19 20
2 green 9 10 11 12 21 22 23 24
3 red 1 2 3 4 13 14 15 16
答案 0 :(得分:13)
我们可以使用dplyr/tidyr
执行此操作。我们将“数据”从“宽”格式重新整形为“长”格式,gather
指定要合并为键/值列对的列(starts_with('value')
)('Var / Val'),{ {1}}'Var'和'y'列创建一个'Var1'列,然后使用unite
重新转换回'wide'格式。
spread
(6个月后)
现在可以使用 library(dplyr)
library(tidyr)
data %>%
gather(Var, val, starts_with("value")) %>%
unite(Var1,Var, y) %>%
spread(Var1, val)
# x value.1_a value.1_b value.1_c value.1_d value.2_a value.2_b value.2_c
#1 blue 5 6 7 8 17 18 19
#2 green 9 10 11 12 21 22 23
#3 red 1 2 3 4 13 14 15
# value.2_d
#1 20
#2 24
#3 16
dcast
重新定义多个值列,而不使用data.table_1.9.5
。我们可以从here
melt
答案 1 :(得分:5)
melt
首先dcast
:
library(reshape2)
data1 <- melt(data, id.vars = c("x", "y"))
dcast(data1, x ~ variable + y)
# x value.1_a value.1_b value.1_c value.1_d value.2_a value.2_b value.2_c value.2_d
#1 blue 5 6 7 8 17 18 19 20
#2 green 9 10 11 12 21 22 23 24
#3 red 1 2 3 4 13 14 15 16