あなたがしようとしているのは、value毎回使用される列を変更することです。への1回の呼び出しでこれを行うことはできませんdcast
結果をマージするためにlapplyとを使用する例を次に示しますReduce
library(plyr) #for . and rename
df <- data.frame(Id = rep(1:2,each=2), Alt = c('a','b'),Choice = c(T,F,F,T), Var1= c(58.2,71.6,14.8,82.1),Var2 =c(4,5,2,5))
by_cols <- c('Choice','Var1','Var2')
df_list <- lapply(by_cols, function(value, data, formula = Id~Alt) {
new <- dcast(data, formula, value.var = value )
# rename not just a a
unique_alt <- unique(data[[as.character(formula)[3]]])
rename(new, setNames(paste(value, unique_alt, sep='.'), unique_alt))},
data = df)
Reduce(function(x,y){merge(x,y,by='Id',all=T)}, df_list)
## Id Choice.a Choice.b Var1.a Var1.b Var2.a Var2.b
## 1 1 TRUE FALSE 58.2 71.6 4 5
## 2 2 FALSE TRUE 14.8 82.1 2 5
dcastをベクトル化する
Vectorizeのベクトル化されたバージョンを作成するために使用できますdcast
dcast.vector <- Vectorize(dcast, vectorize.args = 'value.var', SIMPLIFY = F)
df_list <- dcast.vector(df, Id ~ Alt, value.var = by_cols)
、wideから列の名前を変更する必要がありますab
old_names <- c('a','b')
new_names <- setNames(lapply(by_cols, paste, old_names, sep = '.'), by_cols)
df_list <- mapply(rename, df_list, replace = new_names, SIMPLIFY = F)
あなたはまだReduceステップが必要です
Reduce(function(x,y){merge(x,y,by='Id',all=T)}, df_list)
ベースRの形状変更は、はるかに簡単なソリューションです。