2016-04-05 10 views
5

800 - 700 kanal oranıyla yeni bir sütun nasıl oluşturulur? Kendimi bu tür sorunlara sıkça rastladığımdan çok daha karmaşık data.tables ile buluyorum. Diğer örnekler aynı zamanın 800 kanalını aynı zamanın 700 kanalından çıkarmak olacaktır.Aynı data.table içinde iki grupta bir işlem gerçekleştirilir, her iki grubun da j alanında başvuruda bulunması gerekenler

Örnek: Görebildiğim

kdat <- data.table(channel=c(rep(c(700,800), each = 3)), 
        time=c(rep(1:3,2)), 
        value=c(1:6)) 

    channel time value 
1:  700 1  1 
2:  700 2  2 
3:  700 3  3 
4:  800 1  4 
5:  800 2  5 
6:  800 3  6 

Seçenekler

şunlardır: Uzun geniş formata ve o andan itibaren
1.) Taşı, bölmek sonra uzun geri dönüştürün.
- Sevmiyorum çünkü uzun ve geniş arasında gidip gelmek zorunda.
not: Tüm verileri bir arada tutmaktan ve tüm verileri tek bir data.table dosyasından yapabilirim.

2.) kdat [kanal == 800,. (Değer)]/kdat [kanal = = 700,. (Değer)]
- Bunu sevmiyorum çünkü aynı süreleri denetleme yok vb eşleştirilir.

3.) Bunu yapmak için bir yol var mı? SD veya eksik olduğum başka bir yolla mı?

İstenilen çıktı:

channel time value ratio 
1: 700  1 1  4 
... 
6: 800  3 6  2 
+4

'kdat [, değer [channel == 800]/değer [channel == 700], by = time]'? – MichaelChirico

+0

@MichaelChirico evet çalışır, istenen çıktı almak için küçük bir değişiklik: 'kdat [, oran: = değer [kanal == 800]/değer [kanal == 700], by = zaman]' – kbarreto

cevap

2

muhtemelen

setkey(kdat, time) 
kdat[ 
    dcast(kdat, time~channel, value="value")[, rat := `800`/`700`], 
    rat := i.rat 
] 

Yani geniş uzun olarak değiştirirken, ancak yalnızca birleştirme için kullanılan bu geçici tabloda, ve sadece üç ile yapacağını ilgili sütunlar (zaman, kanal ve değer). Bir kanal için görünen her zaman diğeri için göründüğünü eminsen .SD :) kullanmanız gerekiyorsa


, sen

kdat[order(channel, time), rat := with(split(value, channel), `800`/`700`)] 
+1

Bu ne olup bittiğinden emin değil OP zaten onların sorunu # 1 ile vardı. – Frank

0

Peki yapabilirsiniz

kdat[, copy(.SD)[.SD[channel == 800 
        ][.SD[channel == 700], 
        rat := value/i.value, on='time' 
        ], rat := i.rat, on='time']][] 
İlgili konular