在R:我怎么能编写这个总和......用于?

时间:2014-03-14 08:12:13

标签: r functional-programming

我的问题在于R. 我从数据帧开始,我有2个变量z和p(p是权重) 我需要这笔款项

∑_i ∑_j ((z_i - z_j)·p_i·p_j·I_z)

其中I_z是指标,如果z_i< z_j它是= -1,否则为1 请考虑数据很大,数据帧也可能有10000行 我尝试使用矩阵,但我有记忆问题 我认为有必要使用循环... 有什么建议吗? 谢谢 埃琳娜

1 个答案:

答案 0 :(得分:2)

您的“指标”只是定义abs函数的一种奇特方式。

如果你有足够的RAM,你可以使用outer

set.seed(2)
n <- 2
DF <- data.frame(z=sample(1:2, n, TRUE),
                 p=sample(1:2, n, TRUE))
#  z p
#1 1 2
#2 2 1

sum(outer(seq_len(nrow(DF)), seq_len(nrow(DF)), function(i, j) {
  abs(DF$z[i] - DF$z[j]) * DF$p[i] * DF$p[j] 
}))
#[1] 4

n <- 1e4
DF <- data.frame(z=sample(1:2, n, TRUE),
                 p=sample(1:2, n, TRUE))

sum(outer(seq_len(nrow(DF)), seq_len(nrow(DF)), function(i, j) {
  abs(DF$z[i] - DF$z[j]) * DF$p[i] * DF$p[j]   
}))
#[1] 112224330

如果不这样做,则需要循环。使用combn是一种可能性,但它很慢,因为它基本上是一个循环:

2 * sum(combn(seq_len(nrow(DF)), 2, function(ind) {
  abs(z[ind[1]] - z[ind[2]]) * p[ind[1]] * p[ind[2]]
}))
#[1] 112224330