首页 > 解决方案 > 数组中所有可能对的绝对差之和

问题描述

我正在尝试计算数组的所有可能对的差异之和(差异之和第一/第二+差异第一/第三,差异第二/第一+差异第二/第三,差异第三/第一+差异第三/第二) . 原始数据框由多个列组成,如下所示,colSum 函数仍然不起作用,因为:

“colSums 中的错误(FC_TS1test1,dims = 1):'x' 必须是至少二维的数组”。

我感谢您的帮助!

array <- c(5, 3, 1)

其背后的计算应该是:

|(5-3)|+|(5-1)|=2+4=6
|(3-5)|+|(3-1)|=2+2=4
|(1-5)|+|(1-3)|=4+2=6
6+4+6=16

标签: rarraysdataframesumdifference

解决方案


我们需要没有重复的组合。

sum(combn(a, 2, diff))
# [1] -94

或者,使用一些软件包:

colSums(matrixStats::rowDiffs(RcppAlgos::comboGeneral(a, 2, repetition=F)))
# [1] -94

或者

sum(unlist(RcppAlgos::comboGeneral(a, 2, repetition=F, FUN=diff)))
# [1] -94

两个较小的示例演示了代码的核心功能。

combn(b, 2)
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    3    3    3    4    4    2
# [2,]    4    2    5    2    5    5

RcppAlgos::comboGeneral(b, 2, repetition=F)
#      [,1] [,2]
# [1,]    3    4
# [2,]    3    2
# [3,]    3    5
# [4,]    4    2
# [5,]    4    5
# [6,]    2    5

编辑

对于根据您最近编辑的绝对差异,我们可以定义一个匿名函数:

sum(combn(a, 2, function(x) abs(diff(x))))
# [1] 840

数据:

a <- c(3, 4, 2, 5, 4, 4, 1, 5, 5, 4, 1, 4, 7, 2, 1, 3, 5, 2, 4, 2, 
       7, 4, 4, 1, 4, 3, 4, 4, 2, 4, 1)

b <- c(3, 4, 2, 5)

推荐阅读