我正在尝试创建一个名为requests
的请求列表。我有一个包含数百种产品的列表,但我简化了这个示例代码。
products <- list()
products[[1]] <- c("77295T", "67619Q", "9528QR")
products[[2]] <- c("B7295T", "676193")
requests <- vector("list",length(products[[1]]))
length(requests)
i <- 1
for (i in 1:(length(products[[1]]))) {
requests[[i]] <- cat('"',noquote(products[[1]][[i]]),'~XPORT"', sep = '')
}
结果:
"77295T~XPORT""67619Q~XPORT""9528QR~XPORT"
我正在寻找的最终结果是长度为3的请求列表,其中包含以下三个元素:
requests[[1]]
"77295T~XPORT"
requests[[2]]
"67619Q~XPORT"
requests[[3]]
"9528QR~XPORT"
背景:最终我希望requests
成为嵌套列表(列表列表);在我的数据集products
中是一个列表,这就是为什么我提供products[[2]]
,即使我的问题只涉及用同等产品1迭代products[[1]]. Replacing
产品[[1]]`,创建相同的输出。那段代码在这里:
products1 <- c("77295T", "67619Q", "9528QR")
i <- 1
for (i in 1:(length(products1))) {
requests[[i]] <- cat('"',noquote(products1[[i]]),'~XPORT"', sep = '')
}
这个更简单的代码提供了相同的结果:
"77295T~XPORT""67619Q~XPORT""9528QR~XPORT"
我确实意识到我调用的for循环可能没有必要。我正在努力逐步学习如何&#34;矢量化&#34;我的R代码。任何关于此代码中进一步矢量优雅的建议都将受到赞赏。
答案 0 :(得分:2)
我想你要找的是:
requests <- lapply(products[[1]], function(x){paste0(x, "~XPORT")})
requests
# [[1]]
# [1] "77295T~XPORT"
#
# [[2]]
# [1] "67619Q~XPORT"
#
# [[3]]
# [1] "9528QR~XPORT"
如果您希望对products
中的所有向量执行此操作,我会使用循环:
request <- list()
for(i in 1:length(products)){
request[[i]] <- lapply(products[[i]], function(x){paste0(x, "~XPORT")})
}
我确信这只是实现这一目标的众多方法之一。
上述没有任何循环的替代方法是使用sapply
代替for
sapply(products, function(y){
lapply(y, function(x) paste0(x, "~XPORT"))
})
答案 1 :(得分:0)
正如Ken所建议的那样,为了在不使用循环的情况下获取嵌套列表, as.list()可能对这种情况有所帮助。
products <- list()
products[[1]] <- c("77295T", "67619Q", "9528QR")
products[[2]] <- c("B7295T", "676193")
requests <- lapply(products, function(x){ as.list(paste0(x, "~XPORT"))})
requests
[[1]]
[[1]][[1]]
[1] "77295T~XPORT"
[[1]][[2]]
[1] "67619Q~XPORT"
[[1]][[3]]
[1] "9528QR~XPORT"
[[2]]
[[2]][[1]]
[1] "B7295T~XPORT"
[[2]][[2]]
[1] "676193~XPORT"