2017-10-08 14 views
0

L'extrait de données provient du package mlogit (Game2) qui est en format long pour imiter ma situation. où ch est le rang donné à la plate-forme, et chid est id d'un répondantComment remodeler des données de commande longues dans un format de données large

  age  hours  platform  ch  own  chid 
1  33  2.00  GameBoy  6  0  1   
2  33  2.00  GameCube  5  0  1 
3  33  2.00  PC    4  1  1 
4  33  2.00  PlayStation 1  1  1 
5  33  2.00  PSPortable  3  0  1 
6  33  2.00  Xbox   2  0  1   
7  19  3.25  GameBoy  6  0  2 
8  19  3.25  GameCube  5  0  2 
9  19  3.25  PC    1  1  2 
10  19  3.25   PlayStation 2  1  2 
11  19  3.25   PSPortable  3  0  2 
12  19  3.25   Xbox   4  0  2   
13  18  4.00   GameBoy  6  0  3   
14  18  4.00   GameCube  4  0  3 
15  18  4.00   PC    5  1  3   
16  18  4.00   PlayStation 1  1  3 
17  18  4.00   PSPortable  2  0  3 
18  18  4.00   Xbox   3  0  3 

Je dois convertir ces données longues en grande forme comme indiqué ci-dessous. qui est dans le paquet mlogit. le rang est retenu (de la colonne 1 (ie. ch.Xbox) à la colonne 6 (c.-à-Ch.PC).

ch.Xbox ch.PlayStation ch.PSPortable ch.GameCube ch.GameBoy ch.PC own.Xbox own.PlayStation own.PSPortable own.GameCube own.GameBoy own.PC age hours 
1 2  1    3    5   6   4  0  1    0    0   0   1  33 2.00 
2 4  2    3    5   6   1  0  1    0    0   0   1  19 3.25 
3 3  1    2    4   6   5  0  1    0    0   0   1  18 4.00 

Ma question est de conserver un format long au format large donnée ci-dessus à titre d'exemple.

+1

double possible de [peut le value.var dans dcast une liste ou avoir des variables de valeur multiples?] (Https://stackoverflow.com/questions/23056328/can -la-valeur-var-dans-dcast-be-a-list-ou-have-multiple-value-variables) –

Répondre

2

Nous pouvons utiliser dplyr et tidyr pour effectuer la Reshape.

library(dplyr) 
library(tidyr) 

# Reshape the data  
dt2 <- dt %>% 
    gather(type, value, ch, own) %>% 
    unite("platform_type", type, platform, sep = ".") %>% 
    spread(platform_type, value) %>% 
    arrange(chid) 

Si vous voulez que la sortie finale soit le même que votre sortie désirée, vous pouvez encore préparer un vecteur de noms de colonnes et sélectionnez les colonnes en fonction

# Prepare the column vector 
vec <- c("Xbox", "PlayStation", "PSPortable", "GameCube", "GameBoy", "PC") 
colname <- unlist(lapply(c("ch.", "own."), function(x) paste0(x, vec))) 
colname2 <- c(colname, "age", "hours") 

# Select columns 
dt3 <- dt2 %>% select(colname2) 

# View the result 
ch.Xbox ch.PlayStation ch.PSPortable ch.GameCube ch.GameBoy ch.PC own.Xbox own.PlayStation own.PSPortable own.GameCube own.GameBoy own.PC age hours 
1  2    1    3   5   6  4  0    1    0   0   0  1 33 2.00 
2  4    2    3   5   6  1  0    1    0   0   0  1 19 3.25 
3  3    1    2   4   6  5  0    1    0   0   0  1 18 4.00 

DONNÉES

dt <- read.table(text = "   age  hours  platform  ch  own  chid 
1  33  2.00  GameBoy  6  0  1   
       2  33  2.00  GameCube  5  0  1 
       3  33  2.00  PC    4  1  1 
       4  33  2.00  PlayStation 1  1  1 
       5  33  2.00  PSPortable  3  0  1 
       6  33  2.00  Xbox   2  0  1   
       7  19  3.25  GameBoy  6  0  2 
       8  19  3.25  GameCube  5  0  2 
       9  19  3.25  PC    1  1  2 
       10  19  3.25   PlayStation 2  1  2 
       11  19  3.25   PSPortable  3  0  2 
       12  19  3.25   Xbox   4  0  2   
       13  18  4.00   GameBoy  6  0  3   
       14  18  4.00   GameCube  4  0  3 
       15  18  4.00   PC    5  1  3   
       16  18  4.00   PlayStation 1  1  3 
       17  18  4.00   PSPortable  2  0  3 
       18  18  4.00   Xbox   3  0  3", 
       header = TRUE, stringsAsFactors = FALSE)