在 R 中创建一个连接列表元素和字符串的列表
Create a list concatenating a list element and character string in R
我正在尝试创建一个名为 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
products[[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 循环可能不是必需的。我正在尝试逐渐学习如何 "vectorize" 我的 R 代码。任何关于此代码中进一步矢量优雅的建议将不胜感激。
我猜你要找的是这个:
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"))
})
按照 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"
我正在尝试创建一个名为 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
products[[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 循环可能不是必需的。我正在尝试逐渐学习如何 "vectorize" 我的 R 代码。任何关于此代码中进一步矢量优雅的建议将不胜感激。
我猜你要找的是这个:
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"))
})
按照 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"