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é.

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top