r - 如何在 R 中以相邻 ID 位置为条件创建新变量?

标签 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   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_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 )

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

关于r - 如何在 R 中以相邻 ID 位置为条件创建新变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858142/

相关文章:

r - 通过学生尝试总结重复的项目

r - 在 R 中对 "year/mon"列进行排序

r - Shiny :在控制台中显示服务器和ui之间消息的选项设置是什么

r - ggplot2:facets:不同的轴限制和自由空间

windows - 从本地修改后的 zip 文件安装修改后的包时出错

r - 如何根据因素组合向数据框添加行索引

r - 如何使用R获得角色的不同组合?

r - 如何获取所有终端节点 - r 中的权重和响应预测 'ctree'

使用BERT接口(interface)将缺失值的excel数组读入R

r - 从线性混合模型 (lme4) 获取效果大小