2011-12-13 2 views
3

У меня есть большие набор данныхПроверка недостающих элементов в рваной панели, хранящейся в data.table

dim(dt) 
[1] 422096 162 

где dt является data.table с ключом 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, если нет отверстий во временных рядах. Я понимаю, что у меня могут быть некоторые NA в моей колонке book_lev, поэтому я хотел бы еще больше ограничить. Кроме того, в целом я новичок в data.tables, и я хотел бы посмотреть, есть ли лучшие способы писать то, что я только что написал.

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

+0

Не могли бы вы оставить подмножество ваших данных (например, содержит полдюжины строк за пару лет и, возможно, 4 или 5 столбцов)? Вы получите лучший ответ таким образом и сохраните нам некоторую умственную энергию. Кроме того, я не вижу столбец 'bl2', на который ссылается ваш код. Должно быть? –

+0

@Josh Подмножество данных находится в следующем объекте R. http://econsteve.com/r/dt_sample.Robj – stevejb

+0

@ JoshO'Brien Я не ссылался на столбец bl2. На самом деле это будет book_lev. Я делаю редактирование в исходном сообщении. Большое спасибо за помощь. – stevejb

ответ

1

(Во-первых, оговорка. Я не уверен, что правильно понял, что вы хотите, чтобы ваша переменная 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] 
+0

Благодарю вас за ответ. Я сейчас пытаюсь это сделать. Думаю, ты понял. Большое спасибо за ответ на вопрос. Если это сработает, я соглашусь, и вы получите бонусы за очки. – stevejb

1

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

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

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

+0

Я думаю, что очень немногие мои наблюдения действительно «полные».Я хотел бы выбрать те, которые имеют заданный процент. Спасибо, в любом случае. – stevejb

Смежные вопросы