R 将向量中的唯一值对相乘,并对结果求和
我想乘以向量的唯一对,然后求和,不包括由相同元素组成的对,例如对于R 将向量中的唯一值对相乘,并对结果求和,r,R,我想乘以向量的唯一对,然后求和,不包括由相同元素组成的对,例如对于c(1:4): (1*2)+(1*3)+(1*4)+(2*3)+(2*4)+(3*4)==35 以下代码适用于上述示例: x <- c(1:4) bar <- NULL for( i in 1:length(x)) { bar <- c( bar, i * c((i+1) : length(x)))} sum(bar[ 1 : (length(bar) - 2)]) x循环的替代方法是使用combn并使用FUN
c(1:4)
:
(1*2)+(1*3)+(1*4)+(2*3)+(2*4)+(3*4)==35
以下代码适用于上述示例:
x <- c(1:4)
bar <- NULL
for( i in 1:length(x)) { bar <- c( bar, i * c((i+1) : length(x)))}
sum(bar[ 1 : (length(bar) - 2)])
x循环的替代方法是使用combn
并使用FUN
参数将组合相乘。然后sum
结果:
sum(combn(x = 1:4, m = 2, FUN = function(x) x[1] * x[2]))
# [1] 35
按照@bgoldst的建议,最好在FUN
中使用prod
:
sum(combn(x = 1:4, m = 2, FUN = prod))
如果您想扩展以封装“唯一对”注释,您可以这样做:FUN=function(x)x[1]*x[2]*(x[1]!=x[2])好的解决方案,+1。我只建议将函数(x)x[1]*x[2]
替换为,这样做也是一样的。@RichAtMango我不太确定我是否明白你的意思。看看combn(1:4,2)
@henrik看看combn(c(1,2,3,3,4),2)
。最初的问题是关于“唯一值”,那么这个结果的第2列和第3列是否应该被计数两次呢?@RichAtMango现在我听你的。谢谢你的澄清。我(可能错误地)假设了输入向量中的唯一元素(让OP澄清)。如果不是这样,你的建议是有道理的。或者只需将输入向量包装在unique
?可能的重复:。除了最后的(琐碎的)sum
,OP似乎也在寻找失败循环(XY问题)的解释。