如何根据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 )
但是,如果您有许多变量要求和,这将变得很痛苦。感谢您的快速响应!如果这个问题让你满意,那么你应该把它标记为已回答。