以长格式数据框R折叠变量

时间:2016-08-15 10:58:46

标签: r dataframe

我有一个长格式的数据框,如

id    varA    varB
1     'a'     112
1     'b'     212
1     'c'     308
2     'a'     99
2     'b'     123
2     'c'     452

我想根据id varBvarA == 'a'的每个varA == 'b'折叠。

在如下的广泛数据框中:

id    varBa    varBb    varBc
1     112      212      308
2     99       123      452

...我只是使用apply或像df$collapsed = df$varBa + df$varBb这样的矢量化添加。

如何使用长格式数据框执行此操作? (由于按要素的后续分析,只有宽幅格式不是一种选择)。

是否可以以长格式折叠(或执行任何其他算术运算),以便我有一个额外的行来折叠值?。

2 个答案:

答案 0 :(得分:1)

试试这个:

 dfw <- reshape(df,
 timevar = "varA",
 idvar = c("id"),
 direction = "wide")
 dfw
  id varB.a varB.b varB.c
1  1    112    212    308
4  2     99    123    452

然后你可以对新数据框进行任何数学运算。

答案 1 :(得分:0)

使用tidyr:

df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L),
                     varA = c("a","b", "c", "a", "b", "c"), 
                     varB = c(112L, 212L, 308L, 99L, 123L, 452L)),
                .Names = c("id", "varA", "varB"), 
                class = "data.frame", 
                row.names = c(NA,-6L))

library(tidyr)
wide_df <- spread(df, varA, varB )

  id   a   b   c
1  1 112 212 308
2  2  99 123 452

如果要将标题更改为varBa等,可以使用dplyr&#39; mutate函数来更改varA。

wide_df <- dplyr::mutate(df, varA = paste("varB",df$varA, sep="")) %>% 
  spread(varA, varB )

  id varBa varBb varBc
1  1   112   212   308
2  2    99   123   452