我试图将列的元素与自身相乘,但我无法做到。
我的列A的值为a, b, c
,我希望答案为(a*b + a*c + b*c)
。
例如,用
A <- c(2, 3, 5)
预期输出为sum(6 + 10 + 15) = 31
。
我正在尝试运行循环来执行但是失败了。任何人都可以提供R代码来执行此操作。
答案 0 :(得分:4)
示例数据:
df1 <- data.frame(A=c(2,3,5))
combn将为您提供组合
combinations <- combn(df1$A,2)
# [,1] [,2] [,3]
# [1,] 2 2 3
# [2,] 3 5 5
申请保证金2(按栏目),将进行乘法
multiplied_terms <- apply(combinations,2,function(x) x[1]*x[2])
# [1] 6 10 15
或者更短更通用,感谢@zacdav:
multiplied_terms <- apply(combinations,2,prod)
然后我们可以加总它们
output <- sum(multiplied_terms)
# [1] 31
Piped for a compact solution:
library(magrittr)
df1$A %>% combn(2) %>% apply(2,prod) %>% sum
答案 1 :(得分:1)
这是另一种方式。 @Moody_Mudskipper的方法可能更容易扩展到3等组。但是,我认为这应该快得多,因为不需要实际找到组合。
它只是通过向量A
乘以其余元素直到最后一个。
len <- length(A)
res <- numeric(0)
for (j in seq_len(len - 1))
res <- res + sum(A[j] * A[(j+1) : len]))
res
#[1] 31
可以使用lapply
res <- sum(unlist(lapply(1 : (len - 1), function(j) sum(A[j] * A[(j+1) : len]))))
或sapply
,
res <- sum(sapply(1 : (len - 1), function(j) sum(A[j] * A[(j+1) : len])))
我没有检查哪一个是最快的。
# If you need to store the pairwise multiplications, then use the following;
# res <- NULL
# for (j in 1 : (len-1))
# res <- c(res, A[j] * A[(j+1) : len])
# res
# [1] 6 10 15
# sum(res)
# [1] 31