0

我有两个存储在表中的数据集,一个是一组,[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, bdatasumdataa, bdata2

4

1 回答 1

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它有两列,代表 和 中行号的每个组合data1data2然后我们调用f.new(...)usingdata1data2indexed using indx。这产生了在和result的每个组合处评估的函数。然后我们将其汇总以获得您指定的总和。(a,b)(x,y,z)

这种方法是内存密集型的;result将有 ~ 10MM 元素,但运行速度比循环快。

于 2014-12-19T20:51:57.023 回答