1

次の形式のセミロングデータフレームがあります。

| Id | Alt | Choice | Var1 | Var2 |
|----+-----+--------+------+------|
|  1 | a   | TRUE   | 58.2 |    4 |
|  1 | b   | FALSE  | 71.6 |    5 |
|  2 | a   | FALSE  | 14.8 |    2 |
|  2 | b   | TRUE   | 82.1 |    5 |

...次の形式に再形成したいと思います。

| Id | Choice.a | Choice.b | Var1.a | Var1.b | Var2.a | Var2.b |
|----+----------+----------+--------+--------+--------+--------|
| 1  | TRUE     | FALSE    | 58.2   | 71.6   | 4      | 5      |
| 2  | FALSE    | TRUE     | 14.8   | 82.1   | 2      | 5      |

私は自分自身に次のようなことができるはずだと考え続けています。

library(reshape2)
dcast(df, ... ~ Alt)

しかし、それは正しくありません。

4

2 に答える 2

7

これは「plyr」ではなく、基本関数を使用していますreshape

 dat <- read.table(text=" Id | Alt | Choice | Var1 | Var2 
  1 |a| TRUE   | 58.2 |    4 
  1 |b| FALSE  | 71.6 |    5 
  2 |a| FALSE  | 14.8 |    2
  2 |b| TRUE   | 82.1 |    5
 ", sep="|", header=TRUE)
 reshape(dat, direction="wide", idvar="Id", timevar="Alt")
#-----------------
  Id Choice.a Var1.a Var2.a Choice.b Var1.b Var2.b
1  1  TRUE      58.2      4  FALSE     71.6      5
3  2  FALSE     14.8      2  TRUE      82.1      5

表示した正確な順序が必要な場合は、「[」を使用するだけで簡単です。reshape()の結果を「wdat」に割り当てたと想像してください。

wdat[c(1,2,5,3,6,4,7)]
#===============
  Id Choice.a Choice.b Var1.a Var1.b Var2.a Var2.b
1  1  TRUE     FALSE     58.2   71.6      4      5
3  2  FALSE    TRUE      14.8   82.1      2      5
于 2012-09-11T00:11:05.403 に答える
1

あなたがしようとしているのは、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の形状変更は、はるかに簡単なソリューションです。

于 2012-09-11T00:13:13.937 に答える