R 使用应用函数迭代更新同一对象(对于循环应用函数)

R 使用应用函数迭代更新同一对象(对于循环应用函数),r,R,我有一个矩阵,我想把它放到一个应用函数中,并使用矩阵中每个对象的位置和值来选择和更新三维数组中的位置。我可以在for循环中很容易地实现这一点,但我很好奇是否可以在apply函数中实现这一点。我似乎很难理解这一点。我有一些有用的东西,但并不理想 foo <- matrix(c(3, NA, NA, 1, NA, 3, NA, 2, NA), 3, 3, byrow = TRUE) bar <- array(NA, c(3, 3, 3)) 这是一个for循环,它正是我

我有一个矩阵,我想把它放到一个应用函数中,并使用矩阵中每个对象的位置和值来选择和更新三维数组中的位置。我可以在for循环中很容易地实现这一点,但我很好奇是否可以在apply函数中实现这一点。我似乎很难理解这一点。我有一些有用的东西,但并不理想

foo <- matrix(c(3, NA, NA, 1, NA, 3, NA, 2, NA),  
       3, 3, byrow = TRUE)
bar <- array(NA, c(3, 3, 3))
这是一个for循环,它正是我想要的

for (i in 1:3){
  for (j in 1:3){
    if (!is.na(foo[i, j])){
      bar[i, j, foo[i, j]] <- TRUE
    }
  }
}

这是迄今为止我得到的最好的。它确实会更新数组,但它会打印出在每次迭代中所做分配的列表。此外,如果可以在没有的情况下执行此操作,则更容易构造一个三列i、j、k矩阵索引,然后执行赋值

# index matrix
m1 <- cbind(as.matrix(expand.grid(1:3, 1:3)), c(foo))
bar1 <- bar # initial data
# remove the NA rows of the third column of index
bar1[m1[!is.na(m1[,3]),, drop  = FALSE]] <- TRUE

哦,对不起。课文中漏了一个空格。这是一个矩阵。现在就在那里。哦,很有趣。我不知道你能做这样的事。但问题是,如果m1[!is.nam1[,3],]只是一行,它似乎不起作用。你能解释一下发生了什么,为什么在这种情况下不起作用吗?@jamesguy0121对不起,我忘了那个情况。[将drop=TRUE作为默认值。当有一行/列等时,它将删除维度。使用drop=FALSCOOL。因此,更广泛的情况是,您可以使用具有m列维度的对象为任何m维度对象编制索引吗?如果是4-D,您可能需要更改m1 Yea I do。我要求的是一般知识,而不是我现在的情况很好,谢谢!
# index matrix
m1 <- cbind(as.matrix(expand.grid(1:3, 1:3)), c(foo))
bar1 <- bar # initial data
# remove the NA rows of the third column of index
bar1[m1[!is.na(m1[,3]),, drop  = FALSE]] <- TRUE
identical(bar, bar1)
#[1] TRUE