【问题标题】:how to apply a function item by item in for loop in R如何在R的for循环中逐项应用函数
【发布时间】:2021-09-05 18:01:10
【问题描述】:

我有一个复杂的函数,可以逐行处理矩阵。该函数逐行返回必须用作矩阵行条目的值。我需要使用for 循环来确保正确存储这些值。我不能使用简单的lapply 或for 循环立即应用该函数,因为必须有一个基于每行值的条件。有没有办法在每个项目上运行for 循环并将结果存储在矩阵中,然后再移动到下一个项目?请注意,这与我发布的其他问题不同。我的最后一个问题是在矩阵上应用条件。但是,在这里,我需要对项目使用函数并将它们逐行存储在矩阵中。

简单来说:

这里有一个向量列表(存储在列表x 中)。在移动到第二个向量的元素之前,我需要 for loop 循环遍历 x 的每个向量。对于这种情况,我创建了一个空矩阵 (Mat)。然后,我需要在x(即c(1:4))的第一个向量上应用正方形。然后,在移动到平方x的下一个向量之前,如果该行的任何条目是!= 0,则结果存储在Mat(最后一行(行5))中,循环移动到第二个向量。但是,如果所有条目都是==0,那么循环必须停止并返回一个空矩阵。如果第二个向量的结果都是==0,则循环将零存储到Mat 的所有行(除了行5)。如果不是,则循环移动到第三个向量,依此类推。

我的代码给了我一个错误Error in Mat[k, i] <- res[[i]] : number of items to replace is not a multiple of replacement length In addition: Warning message: In seq_len(k - 1) : first element used of 'length.out' argument

    x <- list(c(1:4), c(2,0,0), c(0,0,0), 0)
res <- list() ## I would like to store the result of squares. 
Mat <- matrix(0,5,5) ## here is the matrix where the result 
d <- 5
for(k in d:2){
for (i in seq_along(k-1)){
  res[[i]] <- x[[i]]^2 ## here I would like to find the result of the first item only before moving to the next one.
  Mat[k,i] <- res[[i]] ## store the result of the vector sas a row (bottom to top)
  if(all(setdiff(Mat[k,i], 0) == 0, na.rm = TRUE)){ ## if the result of the current vector is `0` then, I want to stop. The current row and coming rows set to zero. 
    Mat[k,] <- 0
    break 
  }
}
}

Expected result:

   
 Mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    4    0    0    0    0
[5,]    1    4    9    16    0
        

【问题讨论】:

  • @akrun 嗨。你能帮我解决这个问题吗?提前感谢您的帮助。
  • 我不明白。你只是想填写最后一行吗?你有k &lt;- 5:2,所以当i==,你有Mat[5:2, 1] &lt;- res[[1]]。当您设置Mat &lt;- matrix(0, 0, 5) 时,您给了它零行。您不能分配给不存在的行。
  • @MrFlick 感谢您的评论。对不起,这是一个错字。我纠正了矩阵。 Mat&lt;-matrix(0,5,5)。我的函数一次自动查找一行的结果。但是,由于我必须在多行上运行该函数,我需要使用 for 循环。
  • @MrFlick for k &lt;- d:2 将第一次运行的结果存储在 Mat[5,i]
  • @akrun 非常感谢。我在收到之前给你写了信。再次感谢。我很感激。

标签: r


【解决方案1】:

我们可以试试for这样的循环

x <- list(c(1:4), c(2, 0, 0), c(0, 0, 0), 0)
Mat <- matrix(0, 5, 5)
for (k in seq_along(x)) {
    r <- x[[k]]^2
    if (any(r != 0)) {
        Mat[nrow(Mat) - k + 1, seq_along(r)] <- r
    } else {
        break
    }
}

给了

> Mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    4    0    0    0    0
[5,]    1    4    9   16    0

【讨论】:

  • 非常感谢您的大力帮助。我有一个问题,它是在移动到第二个向量之前找到每个向量的结果,还是找到整个结果然后检查条件?如果是,我需要在移动到第二个向量之前检查每个向量的条件。再次感谢。
  • @Maryam 在添加到Mat 之前检查一个向量。如果检查失败,则停止整个过程,即跳过以下所有向量。
  • 谢谢。是的,我就是这么想的。我的观点是,除非前一个向量通过条件,否则不应计算每个向量的平方。因此,我认为您的解决方案可以找到所有向量的每个项目的正方形。然后,如果向量不通过条件,则不列出。因此,for 循环实际上找到了该项目,但不会将它们存储在矩阵中,除非它们通过条件,这不是我的意思。对不起。
  • @Maryam 是的,你可以先检查条件,然后进行平方运算。由于0^2 仍然是0,所以不管你先拿哪个顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多