/ / R: Fondre et dcast - r, fondre, dcast

R: faire fondre et dcast - r, fondre, dcast

J'ai un jeu de données comme celui-ci:

CASE_ID = c("C1","C1", "C2","C2", "C2", "C3", "C4")
PERSON_ID = c(1,0,7,8,1,20,7)
PERSON_DIVISION = c("Zone 1", "NA", "Zone 1", "Zone 3", "Zone 1", "Zone 5", "Zone 1")
df <- data.frame(CASE_ID, PERSON_ID, PERSON_DIVISION)
df

Cela se traduit par:

CASE_ID PERSON_ID PERSON_DIVISION
1      C1         1          Zone 1
2      C1         0              NA
3      C2         7          Zone 1
4      C2         8          Zone 3
5      C2         1          Zone 1
6      C3        20          Zone 5
7      C4         7          Zone 1

Et je veux le transformer en:

CASE_ID P1_ID  P2_ID  P3_ID  P1_Division  P2_Division   P3_Division
1       1       0     NA        Zone 1      NA           NA
2       7       8     1         Zone 1      Zone 3      Zone 1
3       20      NA    NA        Zone 5      NA          NA
4       7       NA    NA        Zone 1      NA          NA

Mon approche jusqu’à présent a été de faire fondre les données et de les transmettre à Dcast:

e <- melt(df)

dcast(e, CASE_ID  ~ PERSON_DIVISION + variable)

Mais je n'obtiens pas le résultat souhaité, mais plutôt:

CASE_ID NA_PERSON_ID Zone 1_PERSON_ID Zone 3_PERSON_ID Zone 5_PERSON_ID
1      C1            1                1                0                0
2      C2            0                2                1                0
3      C3            0                0                0                1
4      C4            0                1                0                0

Réponses:

1 pour la réponse № 1

Il y a deux problèmes ici:

  1. Vos données sont déjà au format long mais vous avez deux colonnes de valeur. Les versions récentes de data.table soutenir plusieurs vars de valeur dans dcast().
  2. Vous avez besoin d'identifiants de ligne uniques dans chaque groupe. Autrement, dcast() essaiera d’agréger les doublons (en utilisant length() par défaut, ce qui explique le résultat obtenu).

S'il vous plaît essayez

library(data.table)   # version 1.10.4 used here
# coerce to data.table, add unique row numbers for each group
setDT(df)[, rn := rowid(CASE_ID)]
# dcast with multiple value vars
dcast(df, CASE_ID ~ rn, value.var = list("PERSON_ID", "PERSON_DIVISION"))
#   CASE_ID PERSON_ID_1 PERSON_ID_2 PERSON_ID_3 PERSON_DIVISION_1 PERSON_DIVISION_2 PERSON_DIVISION_3
#1:      C1           1           0          NA            Zone 1                NA                NA
#2:      C2           7           8           1            Zone 1            Zone 3            Zone 1
#3:      C3          20          NA          NA            Zone 5                NA                NA
#4:      C4           7          NA          NA            Zone 1                NA                NA

Cela peut être écrit de manière plus concise comme une ligne:

dcast(setDT(df), CASE_ID ~ rowid(CASE_ID), value.var = list("PERSON_ID", "PERSON_DIVISION"))