【发布时间】: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 <- 5:2,所以当i==,你有Mat[5:2, 1] <- res[[1]]。当您设置Mat <- matrix(0, 0, 5)时,您给了它零行。您不能分配给不存在的行。 -
@MrFlick 感谢您的评论。对不起,这是一个错字。我纠正了矩阵。
Mat<-matrix(0,5,5)。我的函数一次自动查找一行的结果。但是,由于我必须在多行上运行该函数,我需要使用for循环。 -
@MrFlick for
k <- d:2将第一次运行的结果存储在Mat[5,i] -
@akrun 非常感谢。我在收到之前给你写了信。再次感谢。我很感激。
标签: r