2016-04-04 21 views
0

arasındaki farka göre başka bir tabloda bir satıra eşleştirin Her biri aynı sistemin ayrı özniteliklerini ölçen iki eşit olmayan aralıklı zaman dizim var. İki dizinin veri noktaları aynı zamanda örneklenmez ve seri aynı uzunlukta değildir. Her satırı, A serisinden, zamana en yakın B satırına eşleştirmek istiyorum. Aklımda bulunan şey, B'ye en yakın satırdaki indeksleri içeren bir A sütunu eklemektir. Her iki seride de Unix zamanında ölçülen bir zaman sütunu vardır (ör. 1459719755). örneğin Tablodaki her satırı, satır zaman damgaları

, verilen iki veri seti

a time 
2 1459719755 
4 1459719772 
3 1459719773 

b time 
45 1459719756 
2 1459719763 
13 1459719766 
22 1459719774 

birinci veri kümesi B[4,]$timeA[2,]$time ve A[3,]$time yakın bir değere sahiptir, A[1,]$time yakın bir değere sahiptir B[1,]$time yana

a time  index 
2 1459719755 1 
4 1459719772 4 
3 1459719773 4 

için güncellenmelidir.

Bunu yapmak için uygun bir yol var mı? Böyle

+0

Tablolar zamana göre sıralanırsa, iki tablodan birleştirme stili tek geçiş yapabilirsiniz. Birleştirilmiş verilerle ne yapmak istersiniz? Her iki/daha fazla sütun içeren tek bir tablo alın? – Philip

cevap

1

deneyin şey:

(1+ecdf(bdat$time)(adat$time)*nrow(bdat)) 
[1] 1 4 4 

Neden bu iş ki? Ecdf işlevi, 0 ile 1 arasında bir değere sahip olan başka bir işlevi döndürür. Bu, ecdf'a ilk bağımsız değişken tarafından tanımlanan değer dağılımındaki yeni bir değerin "olasılık aralığı" [0,1] 'de "konumunu" döndürür. İfade gerçekten sadece bu işlevin sonucunu [1, nrow (bdat)] aralığına yeniden ölçeklendirmektir. (Bence zarif sayılır.)

Başka bir yaklaşım, bdat$time'un sıralanmış değerleri üzerine approxfun kullanmak olacaktır; Bunların yuvarlatılması gerekebilir. Onları indis olarak kullanmak yerine tamsayıya keser.

apf <- approxfun(x=sort(bdat$time), y=seq(length(bdat$time)) ,rule=2) 
apf(adat$time) 
#[1] 1.000 3.750 3.875 
round(apf(adat$time)) 
#[1] 1 4 4 

Her iki durumda da "sipariş istatistiğinden" sıralı bir değer öngörüyorsunuz. İkinci durumda, bağların arzu ettiğiniz şekilde işlendiğini kontrol etmelisiniz.

+0

Bu sözdizimini tanımıyorum: func (x) (y) '. –

+0

Bunun nedeni genellikle "ecdf" kullanmıyor olmanızdır. Bir işlevi döndüren bir işlev o kadar da yaygın değildir, ancak gerçekleştiğinde, bunları parantez içinde bağımsız değişkenleri geçirerek kullanabilirsiniz. Bdat'ın ikinci veri tabanı adı olduğu 'ecdf (bdat $ time)' yazmayı deneyin. '' (Function (x) {mean (x)}) (rnorm (10)) 'dan farklı değil. Sadece denediğimde 0.1410476 döndü. –

+0

Katılıyorum, bu zarif saygısız! Daha genel olarak uygulanabilir çözümün bahsettiğiniz ikinci yaklaşımı gerektireceğine inanıyorum, çünkü 'ecdf()()' her zaman girişleri en yakın alt örnek noktasına yuvarlar. 'Approxfun' nasıl kullanılacağını gösterebilir misiniz? –

İlgili konular