感谢@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.lookup
和{{1}给出其中包含只有一个reviews.lookup
值的逻辑向量,用于从TRUE
返回所需的向量。然后,for循环的每个循环将提取的向量存储在变量model.list
,model
,price
和size
上。
可以将其更改为矢量操作吗?
答案 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
评估。