更新
感谢@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
和 reviews.lookup
包含只有一个 TRUE
值的逻辑向量,用于从 model 返回所需的向量.列表
。然后,for 循环的每个循环将提取的向量存储在变量 model
、price
、size
和 reviews
中。
这能改成向量运算吗?
最佳答案
一般来说,尽量避免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/