r - 用 dplyr 从长到宽

标签 r dplyr reshape2

<分区>

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

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(),但我似乎无法弄明白。

最佳答案

我们可以使用 tidyr/dplyr 来做到这一点。我们收集数据集为“long”格式,联合“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

注意:“val”不同,因为 OP 没有为 runif

设置 seed

关于r - 用 dplyr 从长到宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39066811/

相关文章:

r - 轴反转及变更极限

r - 找出给定函数中调用了哪些函数

r - 调整功能以与 dplyr/magrittr 一起使用

r - 使用 R 将一列提取为行,保留其他列

r - 在 R 中使用 dplyr、tidyr、reshape2 进行复杂熔化

r - 传播与 dcast

r - 如何更改数据框中的长字符串中的所有列名称?

r - 如何在 igraph 中对社区集群内的边缘进行着色

R ggvis 来自单个数据框的多个图

r - dplyr top_n() - 抑制状态消息?