我有两个存储在表中的数据集,一个是一组,[a, b]
另一个是[x, Sx, y, Sy, rho]
. 我有一个f
需要的概率函数(a, b, x, Sx, y, Sy, rho)
。[x, Sx, y, Sy, rho]
最后,我想找到第一个概率结果的总和[a, b]
。[x, Sx, y, Sy, rho]
然后找到第二个的总和[a, b]
,等等......
我想文件中有几百行,[x, Sx, y, Sy, rho]
文件中有几十万行[a, b]
。
我想知道是否有办法在不使用两个循环的情况下做到这一点?我已经尝试了以下方法,但它并没有按照我想要的方式工作,但我知道它会太慢。
我不知道它是否会有所帮助,但我已在代码中添加了该功能。对不起,函数本身是一团糟,格式不正确。
# data file with (a, b)
data <- matrix( c(1, 0, 1, 1, 0.5, 0), nrow=3, ncol=2)
colnames(data) <- c("a", "b")
Ndat <- dim(data)
Ndata <- Ndat[1]
# data2 file with (x, Sx, y, Sy, rho)
data2 <- matrix( c(1, 0.1, 1, 0.1, 0.002, 2, 0.1, 2, 0.1, 0.000001,
2, 0.1, 1, 0.1, 0.002), nrow=3, ncol=5)
colnames(data2) <- c("x", "Sx", "y", "Sy", "rho")
Ndat2 <- dim(data)
Ndata2 <- Ndat[1]
# function requires variables (a, b, s, Sx, y, Sy, rho)
Prob <- function(a, b, Xi, sX, Yi, sY, rho) {sqrt(1 + a ^ 2) * (
exp(-((b + a * Xi - Yi) ^ 2 / (
2 * ((a ^ 2 * sX ^ 2) -
(2 * a * rho * sX * sY) + sY ^ 2)))) * sqrt((
1 - rho ^ 2) / (
a ^ 2 * sX ^ 2 - 2 * a * rho *sX *sY + sY ^ 2))/(
sqrt(2 * pi) * sqrt(1 - rho ^ 2)))
}
# Here is my weak attempt
Table <- NULL
Table <- for (j in 1:Ndata) {
sum (for (i in 1:Ndata2) {
Datatable[i] = Prob(data[j, a], data[j, b], data2[i, x],
data2[i, Sx], data2[i, y], data2[i, Sy],
data2[i, rho])
})
}
我很难理解这些apply
功能以及何时可以/应该使用它们。我知道我可能没有添加足够的信息,所以任何可以帮助我的建议都会很棒。我对编程和 R 都很陌生,所以请原谅任何不恰当的词汇或格式。
可能有更好的方法来定义data
要获取Ndata
的全局数或行数,但这些是我偶然发现的第一个。
该函数不应该是递归的,但我现在看到它就像我写的那样。我花了很多时间在 R 的介绍教程上,但仍然很难理解如何apply
最好地实现这套函数。
我希望一次迭代将此函数应用于从第一行开始data2
使用的每一行。然后是所有这些的概率。然后下一次迭代应该将第 2 行的所有概率相加,应用于每行a, b
data
sum
data
a, b
data2