Проверка отсутствующих элементов на неровной панели, хранящейся в data.table - PullRequest
3 голосов
/ 14 декабря 2011

У меня большой набор данных

 dim(dt)
 [1] 422096    162

, где dt - это таблица данных с ключом tic. Я пытаюсь измерить для каждой группы, сколько у меня пропущенных записей. Группы - это временные ряды, и dt содержит столбец date, представляющий собой дату R, и столбец book_lev, представляющий интерес для меня.

Это мой код:

dt <- dt[sumdt]
sumdt <- dt[ ,list(min.date=min(date), max.date=max(date)), by="tic"]

sublengths <- dt[,list(tslen=length(date)),by=tic, mult="last"]
bt2 <- dt[sublengths, mult="first"]
bt2[, max.year:=extractyear(max.date)]
bt2[, min.year:=extractyear(min.date)]
bt2[, data.fullness:=tslen/(max.year - min.year + 1)]

dt <- dt[bt2]

Моя идея состояла в том, чтобы я создал это значение data.fullness, которое должно равняться 1, если во временном ряду нет дыр. Я понимаю, что в моем столбце book_lev могут быть некоторые NA, поэтому я бы хотел еще больше ограничиться. Кроме того, в целом я новичок в data.tables и хотел бы узнать, есть ли лучшие способы написать то, что я только что написал.

Небольшая выборка данных, которую вы можете загрузить с помощью команды R's load, доступна здесь: http://econsteve.com/r/dt_sample.Robj

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

(Во-первых, предостережение. Я не уверен, что правильно понял, что вы хотите, чтобы ваша переменная data.fullness суммировала. Исходя из набора данных, с которым вы связаны, я считаю, что это соотношение лет с некоторые данные в интервале от первого измеренного года до последнего измеренного года.)

Вот подход, который я бы применил к проблеме, поскольку я делаю понимаю это:

## FIRST, DEFINE A COUPLE OF FUNCTIONS

extractYear <- function(X) {
    as.numeric(format(as.Date(X, format="%m/%d/%Y"), "%Y"))
}

calcFullness <- function(YRS) {
    length(unique(YRS))/(diff(range(YRS))+1)
}

## THEN SET TO WORK ON YOUR DATA.TABLE

key(dt) <- "tic"
dt[, year:=extractYear(datadate)]

# Extract summaries for each level of tic
ticSumm <- 
    dt[, list(min.year = min(year),
              max.year = max(year),
              data.fullness = calcFullness(year)), by=tic]
ticSumm
#       tic min.year max.year data.fullness
# [1,] AMZN     1995     2010             1
# [2,]   GM     1950     2010             1
# [3,]  XOM     1950     2010             1


# Merge summary back into dt
dt <- dt[ticSumm]
1 голос
/ 14 декабря 2011

Если у вас есть прямоугольный фрейм данных и вы хотите ограничить выполнение полными наблюдениями, вы можете создать вектор логических значений, обозначающих полностью наблюдаемые строки данных, с помощью функции complete.cases. Предполагается, что вы очистили данные и согласовали форматирование пропущенных значений, используя R NA.

Этот логический вектор может использоваться для поднабора значения напрямую или с помощью функции subset.

Мне не понятно из вашего описания проблемы или примера кода, как форматируется объект dt, но вам может потребоваться использовать некоторую комбинацию циклов, чтобы успешно получить 2-мерные срезы ваших данных, где можно применить complete.cases.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...