Refaçonner trame de données pour convertir des facteurs en colonnes par R
Question
J'ai une trame de données où une colonne particulière a un ensemble de valeurs spécifiques (disons, 1, 2, ..., 23). Ce que je voudrais faire est de convertir cette mise en page à celui, où le cadre aurait des colonnes supplémentaires 23 (dans ce cas), chacun représentant l'une des valeurs de facteur. Les données contenues dans ces colonnes seraient booléens indiquant si une ligne particulière avait une valeur de facteur donné ... Pour montrer un exemple précis:
Cadre Source:
ID DATE SECTOR
123 2008-01-01 1
456 2008-01-01 3
789 2008-01-02 5
... <more records with SECTOR values from 1 to 5>
Format souhaité:
ID DATE SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5
123 2008-01-01 T F F F F
456 2008-01-01 F F T F F
789 2008-01-02 F F F F T
Je n'ai pas de problème à faire dans une boucle, mais j'espérais qu'il y aurait une meilleure façon. Jusqu'à présent, reshape()
n'a donné le résultat souhaité. L'aide serait très apprécié.
La solution
Je voudrais essayer de lier une autre colonne appelée « valeur » et définir value = TRUE
.
df <- data.frame(cbind(1:10, 2:11, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
df <- data.frame(df, value=TRUE)
Ensuite, faites un Reshape:
reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")
Le problème avec l'utilisation de la fonction reshape
est que la valeur par défaut pour les valeurs manquantes est NA (dans ce cas, vous devrez itérer et les remplacer par FAUX).
Sinon, vous pouvez utiliser cast
sur le paquet reshape
( voir cette question pour un exemple ), et définir la valeur par défaut à FALSE
.
df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE)
> df.wide
ID DATE 1 2 3
1 1 2 TRUE FALSE FALSE
2 2 3 FALSE TRUE FALSE
3 3 4 FALSE FALSE TRUE
4 4 5 TRUE FALSE FALSE
5 5 6 FALSE TRUE FALSE
6 6 7 FALSE FALSE TRUE
7 7 8 TRUE FALSE FALSE
8 8 9 FALSE TRUE FALSE
9 9 10 FALSE FALSE TRUE
10 10 11 TRUE FALSE FALSE
Autres conseils
Voici une autre approche utilisant xtabs
qui peut ou ne peut pas être plus rapide (si quelqu'un allait essayer de me faire savoir):
df <- data.frame(cbind(1:12, 2:13, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df)
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo)