web-dev-qa-db-fra.com

Comment "dissoudre" les données avec reshape r

J'ai un cadre de données que j'ai fondu en utilisant le paquetage de remodelage que je voudrais "fondre". 

voici un exemple jouet des données fondues (le cadre de données réel est de 500x100 ou plus):

variable<-c(rep("X1",3),rep("X2",3),rep("X3",3))
value<-c(rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3))
dat <-data.frame(variable,value)
dat
 variable     value
1       X1 0.5285376
2       X1 0.5285376
3       X1 0.5285376
4       X2 0.1694908
5       X2 0.1694908
6       X2 0.1694908
7       X3 0.7446906
8       X3 0.7446906
9       X3 0.7446906

Chaque variable (X1, X2, X3) a des valeurs estimées à 3 moments différents (ce qui dans cet exemple de jouet est le même, mais ce n'est jamais le cas). 

Je voudrais le récupérer (retour) sous la forme de:

     X1        X2        X3
1 0.5285376 0.1694908 0.7446906
2 0.5285376 0.1694908 0.7446906
3 0.5285376 0.1694908 0.7446906

Fondamentalement, je voudrais que la colonne de variable soit triée par ID (X1, X2, etc.) et devienne des en-têtes de colonne. J'ai essayé diverses permutations de casting, dcast, refonte, etc. et je n'arrive pas à obtenir les données dans le format que je veux. Il était assez facile de «faire fondre» des données du formulaire large au formulaire plus long (par exemple, le jeu de données dat), mais leur restitution s’avère difficile. Des idées? Je sais que cela est relativement simple, mais j'ai du mal à conceptualiser comment le faire en mode rehape ou rehape2. 

Merci, LP

15
LP_640

En général, je le fais en créant une colonne id puis en utilisant dcast:

> dat
  variable     value
1       X1 0.4299397
2       X1 0.4299397
3       X1 0.4299397
4       X2 0.2531551
5       X2 0.2531551
6       X2 0.2531551
7       X3 0.3972119
8       X3 0.3972119
9       X3 0.3972119
> dat$id <- rep(1:3,times = 3)
> dcast(data = dat,formula = id~variable,fun.aggregate = sum,value.var = "value")
  id        X1        X2        X3
1  1 0.4299397 0.2531551 0.3972119
2  2 0.4299397 0.2531551 0.3972119
3  3 0.4299397 0.2531551 0.3972119
21
joran

En fonction de la robustesse dont vous avez besoin, les éléments suivants seront correctement convertis en fonction du nombre d'occurrences variables (et dans n'importe quel ordre).

> variable<-c(rep("X1",5),rep("X2",4),rep("X3",3))
> value<-c(rep(rnorm(1,.5,.2),5),rep(rnorm(1,.5,.2),4),rep(rnorm(1,.5,.2),3))
> dat <-data.frame(variable,value)
> dat <- dat[order(rnorm(nrow(dat))),]
> dat
   variable     value
11       X3 1.0294454
8        X2 0.6147509
2        X1 0.3537012
7        X2 0.6147509
9        X2 0.6147509
5        X1 0.3537012
4        X1 0.3537012
12       X3 1.0294454
3        X1 0.3537012
1        X1 0.3537012
10       X3 1.0294454
6        X2 0.6147509
> dat$id = numeric(nrow(dat))
> for (i in 1:nrow(dat)){
+   dat_temp <- dat[1:i,]
+   dat[i,]$id <- nrow(dat_temp[dat_temp$variable == dat[i,]$variable,])
+ }
> cast(dat, id~variable, value = 'value')
  id        X1        X2       X3
1  1 0.3537012 0.6147509 1.029445
2  2 0.3537012 0.6147509 1.029445
3  3 0.3537012 0.6147509 1.029445
4  4 0.3537012 0.6147509       NA
5  5 0.3537012        NA       NA
1
Leo