如何在r中传播或投射多个值

时间:2014-09-24 14:46:41

标签: r casting reshape2 spread

以下是此示例的玩具数据集:

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

2 个答案:

答案 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

安装devel版本
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