2017-06-01 191 views
0

我试图创建一个名为requests的请求列表。我有一个数百种产品的列表,但我简化了这个示例代码。创建列表连接列表元素和字符串R

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]],即使我的问题涉及到只是迭代products[[1]]. Replacing产品[[1​​]]`与同等产品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循环我打电话可能没有必要。我正在逐渐学习如何“矢量化”我的R代码。将不胜感激这个代码中的任何进一步矢量优雅的建议。

+2

可能'请求< - as.list(paste(products [[1]],“XPORT”,sep =“〜”))'是最简单的答案。 – lmo

+1

'lapply(产品[[1​​]],函数(x){paste0(x,“〜XPORT”)})'也应该工作 –

+0

@lmo你的意思是,这段代码没有循环,对吗?这就是诀窍。 – mrlcpa

回答

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")) 
}) 
+0

这段代码的两部分都起作用。谢谢。我想知道是否有办法避免第二个循环。我尝试了'req4 < - lapply(prods,function(x){paste0(x,“〜XPORT”)})',但是不会生成嵌套列表,只有两个列表,第一个看起来像这样:'“77295T〜XPORT”“67619Q〜XPORT”“9528QR〜XPORT”' – mrlcpa

+1

@mrlcpa我刚刚添加了一个不使用循环的替代方案 –

+0

没有循环的替代方案很有用,谢谢。当我用lapply替换sapply时,得到的'all.equal(request1,request2)'带回'TRUE'。所以我猜在这种情况下它们的功能是一样的。 – mrlcpa

0

正如肯的建议,得到嵌套列表不使用循环,为.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"