2017-05-08 44 views
3

這是我的數據是什麼樣子:如何創建一個新的變量條件在R的鄰居ID位置?

ID XYZ N_ID1 N_ID2 
1 10  3 4    
2 20  8 2   
3 50  6 5   
4 100  2 6   
5 70  7 10   
6 25  1 3   
7 30  2 4   
8 35  6 9 
. .  . . 
. .  . . 
. .  . . 

所以,我有兩個變量在這裏被稱爲「N_ID1」和「N_ID2」,這是「ID」變量的2個鄰居。

我想創建一個基於'XYZ','N_ID1','N_ID2'的新變量,使得新變量是ID位置'N_ID1'處的值的平均值'XYZ'和' N_ID2' 。所以,如果我們看一下ID = 1的第一行,那麼'N_ID1'= 3,'N_ID2'= 4。現在,我的新變量應該是ID = 3時的'XYZ'值的平均值和ID = 4處的'XYZ'值。同樣,對於其他行以及..

這是我最後的結果應該是什麼樣子:

ID XYZ N_ID1 N_ID2 New_Variable 
1 10  3 4 (50+100)/2 = 75    
2 20  8 2 (35+20)/2 = 27.5    
3 50  6 5 (25+70)/2 = 47.5   
4 100  2 6  . 
5 70  7 10  . 
6 25  1 3  . 
7 30  2 4  . 
8 35  6 9  . 
. .  . .  . 
. .  . .  . 
. .  . .  . 

所以,你可以在上面看到,第一個值在「New_Variable」 = 75這是'XYZ'的ID#3和ID#4的平均值

任何人都可以請告訴我如何在R中做到這一點?

回答

4

match每個N_IDxID,子集XYZ,加+,並劃分。

Reduce(`+`, 
    lapply(dat[c("N_ID1","N_ID2")], function(x) dat$XYZ[match(x,dat$ID)]) 
)/2 
#[1] 75.0 27.5 47.5 22.5 NA 30.0 60.0 NA 

沒有功能的方法,這純粹是:

with(dat, (XYZ[match(N_ID1, ID)] + XYZ[match(N_ID2, ID)])/2) 

但是,如果你有很多的變量來總結,這將成爲痛苦。

+0

感謝您的快速響應! –

+0

如果這個問題滿足你,那麼你應該將其標記爲已回答。 –

相關問題