用 dplyr 从长到宽
long to wide with dplyr
我有一个结构如下的数据框:
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
来做到这一点。我们gather
数据集转'long'格式,unite
'variable'和'round'创建'var'然后spread
转'wide'格式。
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
我有一个结构如下的数据框:
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
来做到这一点。我们gather
数据集转'long'格式,unite
'variable'和'round'创建'var'然后spread
转'wide'格式。
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