试图在R中向量化一个for循环

时间:2014-08-11 05:56:13

标签: 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]]])))

ORIGINAL POST

最近我读了一篇关于如何在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.lookupprice.lookup和{{1}给出其中包含只有一个reviews.lookup值的逻辑向量,用于从TRUE返回所需的向量。然后,for循环的每个循环将提取的向量存储在变量model.listmodelpricesize上。

可以将其更改为矢量操作吗?

1 个答案:

答案 0 :(得分:0)

一般情况下,在不需要时尽量避免使用if。我认为你想要的输出可以按如下方式构建。

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

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

我还会注意到你严重过度编码,例如: x<-0优于x<-c(0),并且不需要对单个项目进行length评估。