2016-01-13 17 views
7

tarafından katılmak, öncesinde her (loc.x, loc.y) çifti için, test.day için?Data.Table haddeleme ben <strong>son</strong> değeri bulmak nasıl grubunun

dt <- data.table( 
    loc.x = as.integer(c(1, 1, 3, 1, 3, 1)), 
    loc.y = as.integer(c(1, 2, 1, 2, 1, 2)), 
    time = as.IDate(c("2015-03-11", "2015-05-10", "2015-09-27", 
        "2015-11-25", "2014-09-13", "2015-08-19")), 
    value = letters[1:6] 
) 

setkey(dt, loc.x, loc.y, time) 
test.day <- as.IDate("2015-10-01") 

Gerekli çıkışı:

loc.x loc.y value 
1:  1  1  a 
2:  1  2  f 
3:  3  1  c 

cevap

6

Diğer bir seçenek last işlevini kullanmaktır size of

loc.x loc.y V1 
1:  1  1 a 
2:  1  2 f 
3:  3  1 c 
+6

Bence dt [time

+0

Teşekkür ederim David, iyi nokta – Amitai

6

Önce Sonra (o grup tarafından yapılmazsa, çünkü oldukça verimli olmalı) ve time < test.day grup başına geçen value seçmek satırları alt küme yapabilirsiniz. sonuçlanan Floo0, value[.N] önerdiği gibi siz de tail(value, 1L) kullanabilir veya Bunu yapmak için:

dt[time < test.day, tail(value, 1L), by = .(loc.x, loc.y)] 
# loc.x loc.y V1 
#1:  1  1 a 
#2:  1  2 f 
#3:  3  1 c 

veya

dt[time < test.day, value[.N], by = .(loc.x, loc.y)] 

Not veri setkey(dt, loc.x, loc.y, time) nedeniyle sıralanır çünkü bu işe yarar.

+3

kullanabilir 'değeri [.N]' yerine 'halinde kuyruk (değer, 1 L) '. – Rentrop

+0

@ Floo0, elbette, bu başka bir seçenek. –

5

İşte haddeleme kullanarak başka seçenek katılmak @eddi

dt[dt[, .(time = test.day), by = .(loc.x, loc.y)], roll = T, on = c('loc.x', 'loc.y', 'time')] 

Ya da bir liner önerdiği bir arama tablosu

indx <- data.table(unique(dt[ ,.(loc.x, loc.y)]), time = test.day) 
dt[indx, roll = TRUE, on = names(indx)] 
# loc.x loc.y  time value 
# 1:  1  1 2015-10-01  a 
# 2:  1  2 2015-10-01  f 
# 3:  3  1 2015-10-01  c 

Veya çok benzer bir seçenek oluşturduktan sonra hangi [.data.table'u

grubuna göre arayacağı için daha az verimli olacak

dt[, last(value[time < test.day]), by = .(loc.x, loc.y)] 

verir:

dt[, 
    .SD[data.table(test.day), value, roll = TRUE, on = c(time = "test.day")], 
    by = .(loc.x, loc.y) 
    ] 
# loc.x loc.y V1 
# 1:  1  1 a 
# 2:  1  2 f 
# 3:  3  1 c 
+1

Hmm, dt [dt [,. (Time = test.day), by =. (Loc.x, loc.y)], roll = T, on = c ('loc.x', 'loc) hakkında .y ',' time ')] 'yerine, [.data.table' bir döngü içinde önlemek için? – eddi

+0

Evet, benim düşüncem 'indx <- data.table (benzersiz (dt [,. (Loc.x, loc.y)]), time = test.day); dt [indx, roll = TRUE, on = names (indx)] 'aslında, ama hepsi bir öldürme gibi görünüyor ve bunu silmek üzereydim. –

+0

@eddi İkisine de cevabı ekledim. Sanırım bu daha rekabetçi olacak. –

İlgili konular