简体   繁体   English

R; 用 apply() function 替换嵌套的 for 循环

[英]R; replace nested for loop with apply() function

I am working on data replacement in a matrix.我正在研究矩阵中的数据替换。 The replaced data will be calculated by calculating the sd of the (1+2k)X(1+2k) matrix centered on the value.替换的数据将通过计算以值为中心的 (1+2k)X(1+2k) 矩阵的 sd 来计算。

replace.loop = function(n, m, k, pad){
  #search the value row by row, column by column 
  for (i in n) {
    for (j in m) {
      pad[i,j] = sd(as.vector(pad[(i-k):(i+k),(j-k):(j+k)]))
    }
  }
  return(pad) #return the matrix that finishing calculation
}

Is there any way to rewrite this function with any apply() function?有没有办法用任何 apply() function 重写这个 function? I am an R starter learner, so I am not sure which apply() function I should use.我是 R 初学者,所以我不确定我应该使用哪个 apply() function。

for example:例如:

X = matrix(c(.5,.5,.4,.4,.3,.5,.5,.4,.3,.3,.4,.4,.3,.2,.2,.4,.4,.3,.2,.1,.3,.3,.2,.2,.1), ncol=5)
k = 1
pad.X = matrix(0, dim(X)[1]+2*k, dim(X)[2]+2*k)
n = (k+1):(dim(X)[1]+k);  m = (k+1):(dim(X)[2]+k)
pad.X[n, m] = X

Thanks!谢谢!

I created a copy of pad called padOut .我创建了一个名为padOutpad副本。 mapply will return the results as a matrix, which you can then assign to the relevant portion of padOut using matrix indexing: mapply会将结果作为矩阵返回,然后您可以使用矩阵索引将其分配给padOut的相关部分:

replace.apply = function(n, m, k, pad){
  kk <- -k:k
  idx <- expand.grid(n, m)
  padOut <- pad
  padOut[as.matrix(idx)] <- mapply(function(i) sd(pad[idx[i,1] + kk, idx[i, 2] + kk]), 1:(length(m)*length(n)))
  return(padOut)
}

With your example data:使用您的示例数据:

X = matrix(c(.5,.5,.4,.4,.3,.5,.5,.4,.3,.3,.4,.4,.3,.2,.2,.4,.4,.3,.2,.1,.3,.3,.2,.2,.1), ncol=5)
k = 1
pad.X = matrix(0, dim(X)[1]+2*k, dim(X)[2]+2*k)
n = (k+1):(dim(X)[1]+k);  m = (k+1):(dim(X)[2]+k)
pad.X[n, m] = X

replace.loop = function(n, m, k, pad){
  #search the value row by row, column by column
  padOut <- pad
  
  for (i in n) {
    for (j in m) {
      padOut[i,j] = sd(as.vector(pad[(i-k):(i+k),(j-k):(j+k)]))
    }
  }
  return(padOut) #return the matrix that finishing calculation
}

pad1 <- replace.loop(n, m, k, pad.X)
pad2 <- replace.apply(n, m, k, pad.X)
identical(pad1, pad2)
#> [1] TRUE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM