这是我的数据的样子:
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_Variable”中的第一个值 = 75,它是“XYZ”的 ID#3 和 ID#4 的平均值
谁能告诉我如何在 R 中执行此操作?
最佳答案
匹配
每个N_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 )
但是如果你有很多变量要求和,这将变得很痛苦。
关于r - 如何在 R 中以相邻 ID 位置为条件创建新变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858142/