r - 尝试矢量化 R 中的 for 循环

标签 r for-loop vector vectorization

更新

感谢@CarlWitthoft 的帮助和建议,我的代码被简化为:

model <- unlist(sapply(1:length(model.list),
         function(i) ifelse(length(model.list[[i]][model.lookup[[i]]] == "") == 0,
                            NA, model.list[[i]][model.lookup[[i]]])))

原帖

最近我读了一篇关于如何在 R 中矢量化操作而不是使用 for 循环的文章,我有一段代码,我在其中使用了一个大的 for 循环,我试图让它成为一个矢量操作,但我找不到答案,有人可以帮助我吗?有可能还是我需要改变我的方法?我的代码适用于 for 循环,但我想尝试其他方式。

model <- c(0)
price <- c(0)
size <- c(0)
reviews <- c(0)
for(i in 1:length(model.list)) {
  if(length(model.list[[i]][model.lookup[[i]]] == "") == 0) {
    model[i] <- NA
  } else {
    model[i] <- model.list[[i]][model.lookup[[i]]]
  }
  if(length(model.list[[i]][price.lookup[[i]]] == "") == 0) {
    price[i] <- NA
  } else {
    price[i] <- model.list[[i]][price.lookup[[i]]]
  }
  if(length(model.list[[i]][reviews.lookup[[i]]] == "") == 0) {
    reviews[i] <- NA
  } else {
    reviews[i] <- model.list[[i]][reviews.lookup[[i]]]
  }
  size[i] <- product.link[[i]][size.lookup[[i]]]
}

基本上 model.list 变量是一个列表,我想从中提取特定向量,该向量的位置由变量 model.lookup 给出, price.lookupreviews.lookup 包含只有一个 TRUE 值的逻辑向量,用于从 model 返回所需的向量.列表。然后,for 循环的每个循环将提取的向量存储在变量 modelpricesizereviews 中。

这能改成向量运算吗?

最佳答案

一般来说,尽量避免if不需要的时候。我认为您可以按如下方式构建所需的输出。

model <- unlist(sapply(1:length(model.list), function(i) model.list[[i]][model.lookup[[i]]]))
model[model=='']<-NA

对于您的其他变量也是如此。这假设所有 model.lookup[[i]]长度为一。如果不是,您将无法将输出写入 model 的单个元素。首先。

我还会注意到您严重过度编码,例如x<-0优于x<-c(0) , 不要理会 length对单个项目的评估。

关于r - 尝试矢量化 R 中的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25236642/

相关文章:

java - for 循环如何工作,特别是 for(;;)?

C++::使用 vector 迭代器调用类方法?

r - 将RStudio中的默认编辑器更改为notepad++

r - 代码无法使用 R 中 purrr 包中的 map 工作

javascript - 在循环内调用对象的方法

java - 使用数组获取正数

C++ enable_if 模板类方法,如果它是 std::vector<std::vector<Type>>

c++ - 如果另一个线程将元素推送到 vector 的末尾, vector 上的迭代器会失效吗?

R ginv 和 Matlab pinv 产生不同的结果

r - 从explain_tidymodels更改颜色图