2013-10-26 3 views
2

У меня есть вопрос относительно динамического подмножества таблицы данных. Я знаю, что есть много потоков в stackoverflow, которые деноминированы аналогично, но, к сожалению, они не привели меня к поиску решения.Динамическое подмножество таблицы данных

В примере набор данных:

require(data.table) 
dt <- data.table(date=c(rep(1,5),rep(2,5)),id=rep(1:5,2),var=c(1:10)) 

Для каждого идентификатора Я хотел бы найти подмножество все остальные идентификаторы всех периодов прежде. В примере набора данных есть 5 идентификаторов и два периода. Если посмотреть на ID = 5 в периоде 2, то соответствующее подмножество будет соответствовать ID = {1,2,3,4) и date = 1. В этом простом наборе данных я, конечно, могу это запрограммировать вручную:

dt[,dt[-.I][date<2],by=id] 

Я, однако, хотел бы сделать это автоматически. Я пробовал что-то вроде

dt[,dt[-.I][date < unique(dt$date[.I])],by=id] 

но это не работает, к сожалению.

Любые полезные комментарии оцениваются! Благодаря!

+6

Если вы оцениваете мой вопрос, пожалуйста, оставьте критику, чтобы я мог улучшить вопрос. Благодаря! – chameau13

+1

О, извините за это: в прошлом я рассмотрел некоторые из ваших вопросов, но, думаю, основная идея вопроса (создание огромного количества избыточных данных) ошибочна для большинства приложений (например, вычисление условных вероятностей как в вашем предыдущем q), и что вы попросили его несколько раз раньше. Кроме того, это неопределенное, поскольку вы помещаете «каждый идентификатор ... всех периодов раньше», что на самом деле означает, что вы хотите «каждый идентификатор и дату», как видно из ответов ниже. Соответствующая мета: http://meta.stackexchange.com/q/18552/209360 – Frank

+0

Или, может быть, эта: http://meta.stackexchange.com/questions/8891/is-dont-do-it-a-valid- ответ – Frank

ответ

2

Я думаю, что это быстрее решение:

dta <- data.table(date=c(rep(1,5),rep(2,5)),id=rep(1:5,2),var=c(1:10)) 
dta[,dta[dta[.I]$id!=dta$id & dta[.I]$date>dta$date],by=list(id,date)] 

Любые комментарии о том, как сделать этот код еще быстрее высоко ценится.

3

Вы должны понимать, что комбинации взрываются с увеличением количества уникальных дат/идентификаторов. Даже для даты = 1: 10 и id = 1: 10 ответ составляет 4050 строк (занимает 0,7 секунды), а для даты = 1: 50 и id = 1: 50, это уже 3001250 строк (занимает 6,2 секунды). Сказав, что это должно работать как задумано:

setkey(dt, date, id) 
ans <- dt[!J(1), {d.tmp = date-1; id.tmp = id; dt[CJ(1:d.tmp, 
     setdiff(id, id.tmp))]}, by=list(date, id)] 
setnames(ans, make.unique(names(ans))) 
setkey(ans, date, id, date.1) 

    date id date.1 id.1 var 
1: 2 1  1 2 2 
2: 2 1  1 3 3 
3: 2 1  1 4 4 
4: 2 1  1 5 5 
5: 2 2  1 1 1 
6: 2 2  1 3 3 
7: 2 2  1 4 4 
8: 2 2  1 5 5 
9: 2 3  1 1 1 
10: 2 3  1 2 2 
11: 2 3  1 4 4 
12: 2 3  1 5 5 
13: 2 4  1 1 1 
14: 2 4  1 2 2 
15: 2 4  1 3 3 
16: 2 4  1 5 5 
17: 2 5  1 1 1 
18: 2 5  1 2 2 
19: 2 5  1 3 3 
20: 2 5  1 4 4 
+0

результат верный, выполнение, однако, слишком медленно для моей цели. если я найду решение, которое я отредактирую в ответ. Большое спасибо! – chameau13

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