2017-06-01 193 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"