У меня есть продольный набор данных в таблице данных, аналогичный приведенному ниже упрощенному примеру:
> head(data)
Country ID Date Value
1: AT AT6306 2012-11-01 16.2
2: AT AT6306 2012-11-02 12.2
3: AT AT6306 2012-11-03 11.3
4: AT AT6306 2012-11-04 14.2
5: AT AT6306 2012-11-05 17.3
6: AT AT6306 2012-11-06 12.5
> tail(data)
Country ID Date Value
1: SE SE0935 2014-06-25 16.2
2: SE SE0935 2014-06-26 12.2
3: SE SE0935 2014-06-27 11.3
4: SE SE0935 2014-06-28 14.2
5: SE SE0935 2014-06-29 17.3
6: SE SE0935 2014-06-30 12.5
ID
— переменная панели, она полностью уникальна и не пересекается между странами. Диапазон дат, учитывающий только уникальные значения, находится в диапазоне от 2012-10-23
до 2014-09-30
. Ясно, что диапазоны Date
не идентичны для каждого ID
. Кроме того, могут быть пропущенные значения. Чтобы получить сбалансированную панель, я хочу заполнить пробелы в своем наборе данных.
Адаптация ответа здесь , как предложил @akron, я делаю следующее:
data2 <- data[, CJ(ID=unique(ID), Date=unique(Date))]
setkey(data2, ID, Date)
data.new <- merge(data, data2, by=c("ID", "Date"), all.y = TRUE)
setkey(data.new, ID, Date)
Таким образом, используя параметр all.y = TRUE
, R добавляет строки для каждой отсутствующей даты в data
. Однако теперь все поля, кроме ID
и Date
, пусты, если строки в data
ранее не существовало. То есть мои данные выглядят примерно так
> head(data.new)
Country ID Date Value
1: NA AT6306 2012-10-23 NA
2: NA AT6306 2012-10-24 NA
3: NA AT6306 2012-10-25 NA
4: NA AT6306 2012-10-26 NA
5: NA AT6306 2012-10-27 NA
6: NA AT6306 2012-10-28 NA
Я хочу, чтобы Value
было NA, так как оно отсутствует. Однако, поскольку Country
не меняется для данного ID
, я бы хотел, чтобы поле было заполнено.
Error in bmerge(i <- shallow(i), x, leftcols, rightcols, io <- haskey(i), : typeof x.Date (double) != typeof i.ID (integer)
- person altabq   schedule 03.11.2014CJ()
вi
простым способом, после установки ключей наDT
. Зачем использовать его вj
...?!? - person Arun   schedule 03.11.2014?CJ
и посмотрите, как используется этот пост. Это прямое соединение. Установите ключи сdata
наCountry, ID, Date
. И используйтеDT[CJ(...)]
- это заполнит все пропущенные значения NA по умолчанию. - person Arun   schedule 03.11.2014DT[CJ(...)]
. - person Arun   schedule 03.11.2014dput
. т.е.dput(head(data,20))
. В созданном мной примереCountry
— это класс символов. - person akrun   schedule 03.11.2014Country
, который для меня является классом факторов: я используюdata.new <- merge(data2, data, by=c("ID", "Date"), all.x = TRUE)
для сопоставления двух наборов данных. Однако тогда Страна будетNA
для дат, которые ранее не существовали в поле dData. Is it possible to add the
Country` уже в таблице данныхdata2
?data2 <- data[, CJ(ID=unique(ID), Date=unique(Date)]
- person altabq   schedule 03.11.2014all.x = TRUE
новые строки добавляются для значений, которые существуют вdata2
(таблица данных без пробелов), но не вdata
(исходная таблица данных, которая может содержать пробелы). Посколькуdata2
определяется черезdata2 <- data[, CJ(ID=unique(ID), Date=unique(Date)]
, он не имеет значений для других атрибутов каждой сущности (например,Country
). Следовательно, поле содержит. Я думаю, вы сможете воспроизвести это, оставив одну страну пустой в таблице данныхdata
. - person altabq   schedule 03.11.2014