2016-03-25 27 views
1

Bir sütunun değerini önceki satırlardaki değerine bakarak, bir sütunun değerini güncellemek için data.table işlevlerini kullanmak istiyorum. İşte zaten data.table aşağıdaki gibi bir yolla önceki satırları başvurabilir biliyorduÖnceki satırdaki sütun değerlerini güncelleme

> DT<-data.table(id=1:2,x=1:10,y=1) 

bir örnek:

> DT[,z:=cumsum(y),keyby=id] 
> DT[] 
    id x y z 
1: 1 1 1 1 
2: 1 3 1 2 
3: 1 5 1 3 
4: 1 7 1 4 
5: 1 9 1 5 
6: 2 2 1 1 
7: 2 4 1 2 
8: 2 6 1 3 
9: 2 8 1 4 
10: 2 10 1 5 

Ancak, sonraki örnekte nerede kullanarak Fibonacci serisini oluşturmaya çalışırken, çalışmayan kendisini güncellemek için y numaralı sütundaki önceki değerler. Data.table, iteratif hesaplama yapmak için bir döngü kullanmıyor gibi görünüyor. data.table kullanarak bu tür problemi nasıl çözebilirim?

> DT[,y:=shift(y,1,fill=0)+shift(y,2,fill=0),] 
> DT[] 
    id x y z 
1: 1 1 0 1 
2: 1 3 1 2 
3: 1 5 2 3 
4: 1 7 2 4 
5: 1 9 2 5 
6: 2 2 0 1 
7: 2 4 1 2 
8: 2 6 2 3 
9: 2 8 2 4 
10: 2 10 2 5 

Ne gerçekten istediğiniz altındadır (sütun y güncellenir):

id x y z 
1: 1 1 1 1 
2: 1 3 1 2 
3: 1 5 2 3 
4: 1 7 3 4 
5: 1 9 5 5 
6: 2 2 1 1 
7: 2 4 1 2 
8: 2 6 2 3 
9: 2 8 3 4 
10: 2 10 5 5 
+0

Özellikle bir "fibonacci" dizisinden veya daha genel bir yanıtdan sonra mısınız? – SymbolixAU

+1

Cevabınız için teşekkürler, bu tür bir sorun için daha genel cevaplar arıyorum, 'fibonacci' sadece bir örnektir – xappppp

cevap

5

Yaratma Fibonacci sayıları tanım gereği biz çalışır özel bir işlev tanımlayarak data.table yılında çözebilir sıralı sorundur, kaputun altında bir for.loop ile.

# Define function 
fibon <- function(x) { 
    for(i in 3:length(x)) x[i] = x[i-1] + x[i-2] 
    return(x) 
} 

# Plug into data.table 
DT[,y := fibon(y), by = id] 
> DT 
# id x y z 
#1: 1 1 1 1 
#2: 1 3 1 2 
#3: 1 5 2 3 
#4: 1 7 3 4 
#5: 1 9 5 5 
#6: 2 2 1 1 
#7: 2 4 1 2 
#8: 2 6 2 3 
#9: 2 8 3 4 
#10: 2 10 5 5 
+0

Teşekkürler, çözümünüz çalışıyor! – xappppp

İlgili konular