r - 对于数据集中的每个案例,有没有办法计算应用于该案例的所有标签之间的总距离?
问题描述
对于具有多个二进制变量的数据集,我想创建一个变量来指示案例所附加的每个二进制标签之间的距离总和。
我有一个包含几个二进制变量的数据集,如下所示:
caseid v1 v2 v3 v4
1 one 0 1 0 1
2 two 1 1 0 0
3 three 0 1 1 1
4 four 1 0 1 1
此外,我已经构建了一个距离矩阵,它显示了任何给定变量对之间的距离。它看起来像这样:
v1 v2 v3 v4
v1 0 0.5 0.3 0.2
v2 0.5 0 0.1 0.8
v3 0.3 0.1 0 0.4
v4 0.2 0.8 0.4 0
我想要做的是创建一个新变量,该变量将每种情况下存在的所有变量之间的总距离相加。例如,对于情况三,我想要一个值(v2 和 v3 之间的距离)+(v2 和 v4 之间的距离)+(v3 和 v4 之间的距离)= 0.1 + 0.8 + 0.4 = 1.3。
最终结果将如下所示:
caseid v1 v2 v3 v4 dist
1 one 0 1 0 1 0.8
2 two 1 1 0 0 0.5
3 three 0 1 1 1 1.3
4 four 1 0 1 1 0.9
显然,对于这几个案例,我可以手动进行计算,但我的数据集有大约 800 个案例和 16 个我感兴趣的变量。有没有办法自动化这个过程?
解决方案
您可以使用apply
和的组合combn
来确定数据帧的每一行您感兴趣的成对组合,从矩阵中检索它们,并将它们相加:
df$dist = apply(df[-1],1,function(x) sum(mat[t(combn(c(1:length(x))[as.logical(x)],2))]))
> df
caseid v1 v2 v3 v4 dist
1 one 0 1 0 1 0.8
2 two 1 1 0 0 0.5
3 three 0 1 1 1 1.3
4 four 1 0 1 1 0.9
推荐阅读
- mysql - 如何处理 csv 导入时的“列数据被截断”警告?
- c++ - 我可以在这个例子中使用折叠表达式吗
- c++ - 定义显式转换 - 可能的 GCC 错误
- python - 如何将两个字典写入 CSV?
- c# - 如何使用 Autofac 在同一接口的多个实现之间进行选择?
- c++ - 基本/默认构造函数与构造函数初始化列表
- google-tag-manager - 有没有办法让内容安全策略 2 与 Google 跟踪代码管理器一起使用?
- r - 基于单词列表的分类 R
- arrays - 如何在 TypeScript 中定义具有不同类型项目和特定顺序的数组类型?
- java - PMD CallSuperInConstructor 的原因是什么?