Балансировка (создание одинакового количества строк для каждого отдельного) данных

Учитывая data.table следующим образом, id1 идентификатор предметного уровня, id2 внутренний идентификатор повторного измерения, X переменные данных, которых много. Я хочу сбалансировать данные так, чтобы у каждого человека было одинаковое количество строк (повторных измерений), что является max(DT[,.N,by=id1][,N]), но где id1 а также id2 корректируются по мере необходимости, и X значения данных заменяются на NA для этих новых строк.

Следующие:

DT = data.table(
id1 = c(1,1,2,2,2,3,3,3,3),
id2 = c(1,2,1,2,3,1,2,3,4),
X1 = letters[1:9],
X2 = LETTERS[1:9]
)
setkey(DT,id1)

Должно выглядеть так:

DT = data.table(
id1 = c(1,1,1,1,2,2,2,2,3,3,3,3),
id2 = c(1,2,3,4,1,2,3,4,1,2,3,4),
X1 = c(letters[1:2],NA,NA,letters[3:5],NA,letters[6:9]),
X2 = c(LETTERS[1:2],NA,NA,LETTERS[3:5],NA,LETTERS[6:9])
)

Как вы делаете это с помощью data.table? Избегать зацикливания, поскольку этот набор данных огромен. Это работа для reshape2?

2 ответа

Решение

Вы можете попробовать:

 DT2 <- CJ(id1=1:3, id2=1:4)
 merge(DT,DT2, by=c('id1', 'id2'), all=TRUE)

Вот небольшой вариант ответа Акруна, который обычно используется для решения проблемы:

setkey(DT, id1, id2)
DT[CJ(unique(id1), unique(id2))]
Другие вопросы по тегам