考虑一下我有这些数据:
foo bar baz qux
1 1 65 16
1 2 542 16
1 3 832 16
2 1 1818 20
2 2 56 20
2 3 21 20
3 1 684 213
3 2 216 213
3 3 486 213
它采用长格式,因为每个baz
值取决于bar
ID。我需要得到的是:
foo bar_1 bar_2 bar_3 qux
1 65 542 832 16
2 1818 56 21 20
3 684 216 486 20
所以,我用dcast
尝试了各种各样的事情,但我无法提出正确的方法:
> dcast(data, foo + qux ~ bar, value.var = "baz")
foo qux 1 2 3
1 16 65 542 832
2 20 1818 56 21
3 213 684 216 486
这个几乎让我得到了我想要的东西,但是列的名字还没有。
我可以做些什么来获得最终所需的输出?
答案 0 :(得分:4)
您可以使用重塑
origdata.long <- read.table(header=T, text='
foo bar baz qux
1 1 65 16
1 2 542 16
1 3 832 16
2 1 1818 20
2 2 56 20
2 3 21 20
3 1 684 213
3 2 216 213
3 3 486 213
')
reshape(origdata.long, timevar="bar", v.names="baz", idvar="foo", direction="wide", sep="_")
row.names(wide) <- NULL
> wide
foo qux baz_1 baz_2 baz_3
1 1 16 65 542 832
2 2 20 1818 56 21
3 3 213 684 216 486
答案 1 :(得分:2)
在似乎介于错误和功能之间的某个地方,dcast
中的公式的RHS来自&#34; reshape2&#34;不必是源data.frame
中的变量。这意味着您可以执行以下操作以获得所需的输出:
library(reshape2)
dcast(mydf, foo + qux ~ paste0("bar_", bar), value.var = "baz")
# foo qux bar_1 bar_2 bar_3
# 1 1 16 65 542 832
# 2 2 20 1818 56 21
# 3 3 213 684 216 486
或者,可以在&#34; dplyr&#34;中的mutate
内处理粘贴,它可以与来自&#34; tidyr&#34;的spread
一起使用:
library(tidyr)
library(dplyr)
mydf %>%
group_by(foo, qux) %>%
mutate(bar = paste0("bar_", bar)) %>%
spread(bar, baz)
# Source: local data frame [3 x 5]
#
# foo qux bar_1 bar_2 bar_3
# 1 1 16 65 542 832
# 2 2 20 1818 56 21
# 3 3 213 684 216 486
这两种选择都可以让你在飞行中进行粘贴&#34;而不是覆盖你原来的&#34; bar&#34;带有粘贴值的变量。