Je travaille avec un ensemble de données longitudinales avec observations répétées pour les sujets dans un format long data.table. La plupart des sujets ont quelques observations répétées (< 10), tandis que quelques sujets ont de nombreuses observations (> 100). Je peux convertir cet ensemble de données de temps à large comme ci-dessous, mais il devient extrêmement large (j'ai beaucoup de variables à chaque point de temps) et est surtout pleine de NAs, étant donné que la plupart des sujets ne disposent pas de données pour les variables parfois 11 à 100 Existe-t-il un moyen plus élégant de refondre ces données au format large? Je pense à quelque chose comme un tableau irrégulier dans d'autres langues ...compression colonnes similaires lors de la conversion d'un data.table de temps à large
Certaines solutions existent here, mais une grande préoccupation pour moi est la taille de l'objet: la matrice large avec beaucoup de NA prend beaucoup de inutile espace.
A MWF avec ma solution actuelle (matrice creuse de façon indésirable) est ci-dessous. Idéalement, si une sorte d'approche de liste irrégulière est réalisable, l'objet résultant aurait 3 lignes et 3 colonnes, où les colonnes "année" et "code" sont des listes ou similaires. En prime, ce serait merveilleux si je pouvais imbriquer la variable "code" dans la variable "year" sous la forme de tableaux ragged imbriqués.
library(data.table)
dat <- data.table(id=c(rep(1,5), rep(2,10), rep(3,85)),
year=sample(2013:2016, 100, replace=TRUE),
code=sample(LETTERS, 100, replace=TRUE))
wideDat <- dcast(dat, id~paste0("code", dat[,seq_len(.N), by=id]$V1),
value.var="code")
Pourriez-vous donner aussi un objet qui ressemble à votre sortie désirée? Je devine que c'est la différence wideDat – Frank
@Frank C'est en fait une partie de ma question: je n'ai récemment pris à l'aide data.table, et ont à plusieurs reprises trouvé de belles surprises sur la définition flexible des objets de données. En espérant que quelqu'un pourrait m'éclairer de la même manière ici. Dans un pseudo-objet: colonne 'id = c (1,2,3)'; la colonne 'year' est une liste de longueur 3, chaque item ayant seulement autant d'entrées qu'il y a d'observations longitudinales (ne stockant pas des centaines d'AN); colonne 'code' est une liste de longueur 3 définie de manière analogue à' year'. Pas nécessairement coincé sur des listes (et pas sûr si possible dans le contexte de data.table), c'est juste ce qui vient à l'esprit. –
Ok. Vous pouvez faire 'dat [, lapply (.SD, list), by = id]', mais ce n'est pas un format très utile pour l'analyse ou l'impression ou tout autre chose que je peux penser. – Frank