R:在单个因子变量上加宽多列
R: Widening multiple columns on a single factor variable
我有一个这样的 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 只允许我对一列(值)进行扩展。
从 data.table
的开发版本尝试 dcast
,即 v1.9.5
。这可以采用多个值列,因此您可能不需要将格式更改为 long
。它可以从 here
安装
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"))
此解决方案使用 dplyr
和 tidyr
库:
library(dplyr)
library(tidyr)
df %>%
gather(valvar, value, -factorvar) %>%
unite(key, factorvar, valvar) %>%
mutate(dummy = 1) %>%
spread(key, value) %>%
select(-dummy)
哪个returns:
a_valvar1 a_valvar2 b_valvar1 b_valvar2 c_valvar1 c_valvar2
1 1 2 1 2 1 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 只允许我对一列(值)进行扩展。
从 data.table
的开发版本尝试 dcast
,即 v1.9.5
。这可以采用多个值列,因此您可能不需要将格式更改为 long
。它可以从 here
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"))
此解决方案使用 dplyr
和 tidyr
库:
library(dplyr)
library(tidyr)
df %>%
gather(valvar, value, -factorvar) %>%
unite(key, factorvar, valvar) %>%
mutate(dummy = 1) %>%
spread(key, value) %>%
select(-dummy)
哪个returns:
a_valvar1 a_valvar2 b_valvar1 b_valvar2 c_valvar1 c_valvar2
1 1 2 1 2 1 2