如何根据R中相邻的ID位置创建新变量?

如何根据R中相邻的ID位置创建新变量?,r,R,以下是我的数据: 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

以下是我的数据:

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'变量的两个邻居

我想基于“XYZ”、“N_ID1”、“N_ID2”创建一个新变量,以便新变量是“N_ID1”和“N_ID2”的ID位置处的值的“XYZ”的平均值

如果我们看第一行,其中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#u变量”中的第一个值=75,这是“XYZ”的ID#3和ID#4的平均值


有人能告诉我如何在R中执行此操作吗?

将每个
N\u IDx
匹配到
ID
,子集
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 )

但是,如果您有许多变量要求和,这将变得很痛苦。

感谢您的快速响应!如果这个问题让你满意,那么你应该把它标记为已回答。