使用循环变量时使用 lapply 将 .csv 加载到列表中

问题描述 投票:0回答:1

我有一个列表(

myList
)列表(
A
B
C
D
),每个列表都有其他列表(
a1
a2
a3
),其中看起来像这样。

scenarios <- LETTERS[1:4]
patterns <- c("a1", "a2", "a3")
myList <- list()
for(i in seq_along(scenarios)){
  myList[[i]] <- list()
  for(j in seq_along(patterns)){
    myList[[i]][[j]] <- list()
  }  
  names(myList[[i]]) <- patterns  
}

names(myList) <- scenarios
myList

$A
$A$a1
list()

$A$a2
list()

$A$a3
list()

$B
$B$a1
list()

$B$a2
list()

$B$a3
list()

$C
$C$a1
list()

$C$a2
list()

$C$a3
list()

$D
$D$a1
list()

$D$a2
list()

$D$a3
list()

我需要上传的文件的路径名如下所示:

./path/A/a1_A_table.csv
我不确定如何循环遍历文件名,将组件分配给变量,然后将输出存储在列表中的相应位置。到目前为止,这是我的尝试。

myDfList <- list()
myDfList <- lapply(scenarios, function(scen){
  i = 1  
  myDfList[scen] <- lapply(patterns, function(df){   
    p <- patterns[i]    
    read.csv(paste0("./path/", scen, "/", p, "_", scen, "_table.csv"), sep = ",", h = T, fileEncoding = "UTF-8-BOM")    
    i = i + 1    
  })})

我有点迷失,因为我不明白如何使用

lapply
迭代循环(如果可能并且有意义),或者如果我只是使用
for
循环。

r list loops indexing
1个回答
0
投票

如果你想保持相同的形状,你可以使用一对贴图。

Map(function(top, topname) {
  Map(function(mid, midname) {
    path <- paste0(".path/", topname,"/", midname,"_",topname, "_table.csv", sep=".")
    path
    # read.csv(path)
  }, top, names(top))}, 
myList, names(myList))

由于我没有数据,所以这只是返回路径,但是您可以使用内部 Map 中的路径做任何您想做的事情。这回来了

$A
$A$a1
[1] ".path/A/a1_A_table.csv."

$A$a2
[1] ".path/A/a2_A_table.csv."

$A$a3
[1] ".path/A/a3_A_table.csv."


$B
$B$a1
[1] ".path/B/a1_B_table.csv."

$B$a2
[1] ".path/B/a2_B_table.csv."

$B$a3
[1] ".path/B/a3_B_table.csv."


$C
$C$a1
[1] ".path/C/a1_C_table.csv."

$C$a2
[1] ".path/C/a2_C_table.csv."

$C$a3
[1] ".path/C/a3_C_table.csv."


$D
$D$a1
[1] ".path/D/a1_D_table.csv."

$D$a2
[1] ".path/D/a2_D_table.csv."

$D$a3
[1] ".path/D/a3_D_table.csv."
© www.soinside.com 2019 - 2024. All rights reserved.