2017-02-12 1 views
3

У меня есть data.table как этотКак вернуть Nas недостающих комбинаций при использовании группы по data.table в

library(data.table)  
tt1 <- structure(list(start = c(3, 4, 4, 4, 22, 4, 16), 
         end = c(5, 40,40, 40, 25, 40, 18), 
         u = c(1L, 2L, 2L, 2L, 3L, 2L, 4L), 
         duration = c(2, 36, 36, 36, 3, 36, 2), 
         i.start = c(3, 3, 29, 20, 20, 14, 14), 
         i.end = c(5, 5, 31, 22, 22, 16, 16), 
         q = c(7L, 7L, 8L, 9L, 1L, 10L, 10L), 
         i.duration = c(2, 2, 2, 2, 2, 2, 2)), row.names = c(NA,-7L), 
       class = c("data.table", "data.frame"), 
       .Names = c("start", "end", "u", "duration", "i.start", "i.end", "q", "i.duration")) 

setDT(tt1) 
> tt1 
    start end u duration i.start i.end q i.duration 
1:  3 5 1  2  3  5 7   2 
2:  4 40 2  36  3  5 7   2 
3:  4 40 2  36  29 31 8   2 
4:  4 40 2  36  20 22 9   2 
5: 22 25 3  3  20 22 1   2 
6:  4 40 2  36  14 16 10   2 
7: 16 18 4  2  14 16 10   2 

Я хотел бы, чтобы фильтровать записи, в которых «длительность» < = 2 и группы элементов по каждая комбинация (i.start, i.end). Я был в состоянии сделать это,

> tt1[duration<=2, mean(duration), by =c("i.start","i.end"),nomatch=NA] 
    i.start i.end V1 
1:  3  5 2 
2:  14 16 2 

Однако, я также хотел бы NA, чтобы быть возвращен для (i.start, i.end) групп, длительность которых> 2 вместе с предыдущим результатом.

i.start i.end V1 
1:  3  5 2 
2:  14 16 2 
3:  29 31 NA 
4:  20 22 NA 

Как это можно сделать?

+0

FYI: 'тт [длительность <= 2, средняя (длительность), по = с ("i.start", "i.end")]' не воспроизводим. Я думаю, вы имеете в виду 'tt1', но он все еще возвращает ошибку – BigDataScientist

+0

@BigDataScientist Извините. Да, он должен работать с tt1, я исправил это сейчас. Какую ошибку вы получаете? – pauljeba

+0

'Ошибка в' [.data.frame' (tt1, i.duration <= 2, mean (i.duration), by = c ("i.start",: неиспользуемый аргумент (by = c ("i. start "," i.end "))' Возможно, у меня нет соответствующего пакета. Но не беспокойтесь обо мне, я просто хотел указать, что может быть больше ответов, если оно быстро воспроизводится :) – BigDataScientist

ответ

2

Если вы хотите сохранить все группы, то вам, вероятно, придется подмножество внутри каждой группы, как будто вы делаете прямо сейчас (в выражении i).

Мог бы сделать либо

tt1[, mean(duration[duration <= 2]), by = .(i.start, i.end)] 
# i.start i.end V1 
# 1:  3  5 2 
# 2:  29 31 NaN 
# 3:  20 22 NaN 
# 4:  14 16 2 

Или объединить его с if/else заявлением

tt1[, if(any(duration <= 2)) mean(duration[duration <= 2]) else NA_real_, by = .(i.start, i.end)] 
# i.start i.end V1 
# 1:  3  5 2 
# 2:  29 31 NA 
# 3:  20 22 NA 
# 4:  14 16 2 

Другим (странно) путем для достижения этой цели, является первым вычислить только средства, которые вам нужно и затем соединить все возможные группы

res <- tt1[duration <= 2, mean(duration), keyby = .(i.start, i.end)] 
res[unique(tt1[, .(i.start, i.end)]), on = .(i.start, i.end)] 
# i.start i.end V1 
# 1:  3  5 2 
# 2:  29 31 NA 
# 3:  20 22 NA 
# 4:  14 16 2 

Или аналогично

tt1[duration <= 2][unique(tt1[, .(i.start, i.end)]), on=.(i.start, i.end), 
    mean(duration), by=.EACHI] 
# i.start i.end V1 
# 1:  3  5 2 
# 2:  29 31 NA 
# 3:  20 22 NA 
# 4:  14 16 2 
Смежные вопросы