使用dplyr将长格式转换为宽格式

3

我有一个数据框,其结构如下:

dd <- data.frame(round = c("round1", "round2", "round1", "round2"),
                 var1 = c(22, 11, 22, 11),
                 var2 = c(33, 44, 33, 44),
                 nam = c("foo", "foo", "bar", "bar"),
                 val = runif(4))

   round var1 var2 nam        val
1 round1   22   33 foo 0.32995729
2 round2   11   44 foo 0.89215038
3 round1   22   33 bar 0.09213526
4 round2   11   44 bar 0.82644723

我希望得到一个包含两个行的数据框���每个行对应不同的 nam 值,并包含以下变量:var1_round1,var1_round2,var2_round1,var2_round2,val_round1,val_round2。 我真的希望能够找到一个使用 dplyr 的解决方案。

  nam var1_round1 var1_round2 var2_round1 var2_round2 val_round1 val_round2
1 foo          22          11          33          44 0.32995729  0.8921504
2 bar          22          11          33          44 0.09213526  0.8264472

我能想到的最接近的方法是以一些创意的方式使用spread(),但我似乎无法弄清楚。
1个回答

7
我们可以使用tidyr/dplyr来进行这项工作。我们将数据集转换为“长”格式,使用gather函数,然后使用unite函数将“variable”和“round”合并为“var”,最后使用spread函数将其转换为“宽”格式。
library(dplyr)
library(tidyr)
gather(dd, variable, value, var1, var2, val) %>%
         unite(var, variable, round) %>% 
         spread(var, value)
#  nam val_round1 val_round2 var1_round1 var1_round2 var2_round1 var2_round2
#1 bar  0.7187271  0.6022287          22          11          33          44
#2 foo  0.2672339  0.7199101          22          11          33          44

注意:由于OP没有为runif设置seed,因此'val'是不同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接