重塑长数据,使新列名包含原始变量的名称

时间:2014-10-02 13:04:34

标签: r reshape reshape2

考虑一下我有这些数据:

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

这个几乎让我得到了我想要的东西,但是列的名字还没有。

我可以做些什么来获得最终所需的输出?

2 个答案:

答案 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;带有粘贴值的变量。