在R中将列的值乘以其自身的值

时间:2018-02-14 10:48:17

标签: r

我试图将列的元素与自身相乘,但我无法做到。 我的列A的值为a, b, c,我希望答案为(a*b + a*c + b*c)

例如,用 A <- c(2, 3, 5)预期输出为sum(6 + 10 + 15) = 31

我正在尝试运行循环来执行但是失败了。任何人都可以提供R代码来执行此操作。

2 个答案:

答案 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 sapply

可以使用lapply

替换for循环
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