我有两个数据集存储在表中,一个是[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
的第一行中的a, b
将此函数应用于data
中的每一行。然后sum
所有这些的可能性。然后,下一次迭代应该data
的第2行的所有概率的总和使用a, b
应用于data2
的每一行
答案 0 :(得分:0)
我有一种感觉,这样做更容易,但这样的事情可能会有效。
f <- function(a,b,x,y,z) a+b+x+y+z
f.new <- function(p1,p2) {
p1=as.list(p1); p2=as.list(p2)
f(p1$a,p1$b,p2$x,p2$y,p2$z)
}
data1 <- data.frame(a=1:10,b=11:20)
data2 <- data.frame(x=1:5,y=21:25,z=31:35)
indx <- expand.grid(indx2=seq(nrow(data2)),indx1=seq(nrow(data1)))
result <- with(indx,f.new(data1[indx1,],data2[indx2,]))
sums <- aggregate(result,by=list(rep(seq(nrow(data1)),each=nrow(data2))),sum)
您似乎想要为两个变量集的每个组合评估一个函数,(a,b)
的集合和(x, Sx, y, Sy, rho)
的集合,然后求和为第一组的每个实例设置。
首先,重新定义函数f(...)
以获取两个参数,代表两个集合。这是f.new(...)
。您应该以这种方式定义原始函数 - 它将运行得更快。
然后我们创建一个数据框indx
,其中有两列,代表data1
和data2
中行号的每个组合,然后我们使用{f.new(...)
调用data1
使用data2
索引{1}}和indx
。这产生了result
,其(a,b)
和(x,y,z)
的每个组合都评估了函数。然后我们将其汇总以获得您指定的总和。
这种方法是内存密集型的; result
将有~10MM元素,但运行速度比循环快。