Я работаю с продольным набором данных с повторными наблюдениями для объектов в формате long.table. У большинства испытуемых есть несколько (< 10) повторных наблюдений, в то время как у нескольких испытуемых есть много (> 100) наблюдений. Я могу преобразовать этот набор данных от длинного к широкому, как показано ниже, но он становится чрезвычайно широким (у меня много переменных в каждый момент времени) и в основном заполнено НС, так как большинство субъектов не имеют данных для переменных в разы от 11 до 100 Есть ли более элегантный способ перевести эти данные в широкий формат? Я думаю о чем-то в строю оборванного массива на других языках ...Сжатие подобных столбцов при преобразовании данных.table от long to wide
Некоторые решения существуют here, но для меня большая проблема - размер объекта: широкая матрица с большим количеством НС занимает много ненужных пространство.
MWE с моим текущим (нежелательно разреженной матрицей) решением ниже. В идеале, если какой-либо подход с оборванным списком возможен, результирующий объект будет иметь 3 строки и 3 столбца, где столбцы «год» и «код» являются списками или похожими. В качестве бонуса было бы замечательно, если бы я мог вложить переменную «code» внутри переменной «year» в виде вложенных оборванных массивов.
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")
Не могли бы Вы также предоставить объект, который выглядит как ваш желаемый результат? Я предполагаю, что это не похоже на wideDat – Frank
@Frank Это на самом деле часть моего вопроса: я только недавно занялся использованием data.table и много раз встречал замечательные сюрпризы относительно гибкого определения объектов данных. Надеясь, что кто-то тоже может просветить меня здесь. В псевдообъекте: столбец 'id = c (1,2,3)'; столбец 'year' - это список длины 3, каждый элемент имеет только столько записей, сколько есть продольных наблюдений (не сохраняя сотни НС); column 'code' - это список длин 3, определенный аналогично' year'. Не обязательно застревать в списках (и не уверен, если это возможно в контексте data.table), это только то, что приходит на ум. –
Хорошо. Вы можете сделать 'dat [, lapply (.SD, list), by = id]', но это не очень полезный формат для анализа или печати или что-то еще, о чем я могу думать. – Frank