2016-11-08 14 views
3
library('data.table') 
set.seed(1) 
A<-data.table(age = rnorm(10, mean = 10), V1= rnorm(10)) 

一定標準的情況是,我要創建的data.table一個新列,對於每個觀察,它會尋找具有任何年齡的觀察差距在0.5到1年之間,並且對於當前的觀察,使用該觀察的V1的值作爲V2。如果有多個符合標準的觀測值,只需確定最接近0.5年差距的觀測值即可。識別觀察快捷方式,滿足data.table

我想知道是否有一個快速的方法來實現data.table中沒有使用for循環。

回答

4

這是可能的...和樂趣......但不是很漂亮,也不可讀:

CJ(A1=A$age,A2=A$age)[,.(A1, A2,d=abs(A1-A2)) 
         ][d>=0.5 & d<=1 
         ][, .(d, dmin=min(d),A2), by="A1" 
          ][d==dmin 
          ][A, .(A1, A2,V2=i.V1,d), on=c(A2="age"), nomatch=0 
           ][A, .(age=A1, A2, V1, d, V2), on=c(A1="age")] 

      age  A2   V1   d   V2 
1: 9.373546 10.183643 1.51178117 0.8100971 0.38984324 
2: 10.183643 10.738325 0.38984324 0.5546814 0.94383621 
3: 9.164371 9.694612 -0.62124058 0.5302402 0.59390132 
4: 11.595281 10.738325 -2.21469989 0.8569561 0.94383621 
5: 10.329508 9.694612 1.12493092 0.6348962 0.59390132 
6: 9.179532 9.694612 -0.04493361 0.5150800 0.59390132 
7: 10.487429 9.694612 -0.01619026 0.7928174 0.59390132 
8: 10.738325 10.183643 0.94383621 0.5546814 0.38984324 
9: 10.575781 9.694612 0.82122120 0.8811697 0.59390132 
10: 9.694612 9.179532 0.59390132 0.5150800 -0.04493361 
+0

嗨HubertL,謝謝你很多的答案!我想知道如果數據堆疊有不同的唯一標識符,是否可以這樣做。所以如果有兩個或兩個以上的人,是否可以用'by = id'來做到這一點? – YDao

+0

如果您使用'\ n'['而不是'] [\ n'],那麼您的編輯器可以爲管道 –

+0

中的每一行乾淨地排列列,您可以使用滾動連接或非等連接更快(更快)但它不會更漂亮 – eddi