我的问题在于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行 我尝试使用矩阵,但我有记忆问题 我认为有必要使用循环... 有什么建议吗? 谢谢 埃琳娜
答案 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