2

我有一个像这样的 R 数据框,其中包含一个因子变量和两个或多个值变量。

> factorvar <- c('a', 'b', 'c')
> valvar1 <- c(1, 1, 1)
> valvar2 <- c(2, 2, 2)
> df <- data.frame(factorvar, valvar1, valvar2)
> df
  factorvar valvar1 valvar2
1         a       1       2
2         b       1       2
3         c       1       2

我想扩大它,使最终的数据框看起来像下面这样:

> dfnew
  valvar1.a valvar1.b valvar1.c valvar2.a valvar2.b valvar2.c
  1         1         1         1         2         2         2

带有传播的 dplyr/tidyr 只允许我为一列(值)执行此操作。

4

2 回答 2

3

此解决方案使用dplyrtidyr库:

library(dplyr)
library(tidyr)

df %>%
  gather(valvar, value, -factorvar) %>%
  unite(key, factorvar, valvar) %>%
  mutate(dummy = 1) %>%
  spread(key, value) %>%
  select(-dummy)

返回:

  a_valvar1 a_valvar2 b_valvar1 b_valvar2 c_valvar1 c_valvar2
1         1         2         1         2         1         2
于 2015-03-23T18:33:44.350 回答
1

从iedcast的开发版本中 尝试。这可以采用多个值列,因此您可能不需要将格式更改为. 它可以从安装data.tablev1.9.5longhere

 library(data.table)
 dcast(setDT(df)[,ind:=1:.N, by = factorvar], ind~factorvar, 
              value.var=c('valvar1', 'valvar2')) 
 #    ind a_valvar1 b_valvar1 c_valvar1 a_valvar2 b_valvar2 c_valvar2
 #1:   1         1         1         1         2         2         2

或者@Arun 提供的更紧凑的选项

 dcast(setDT(df), . ~ factorvar, value.var=c("valvar1", "valvar2"))
于 2015-03-23T18:22:29.103 回答