当前位置: 首页 > 知识库问答 >
问题:

当我遍历列表时,无法遍历列表

曹驰
2023-03-14

输入是一个列表列表。请看下面。文件名是一个列表,包含的名称与列表中的列表数量相同(name1name2name3
每个名称都附加到路径中:path/name1-path/name2-path/name3

程序在遍历列表时遍历包含路径的列表,并打印路径及其文件名。我希望输出是path/name1-path/name2-path/name3。然而,我得到了下面的输出。请查看输入后的输出

输入

[[1]]
[1] "150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"   "160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
[3] "JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"       "JF_160426_Dep2Plas_tryp_Gpep_SIDtarg-(06)_PSMs.txt"       

[[2]]
[1] "150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"   "160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
[3] "JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"      

[[3]]
[1] "150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"   
"160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"

输出

我希望输出是path/nam1-path/name2-path/name3

[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/name1.tsv", 
[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/name2.tsv", 
[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/name3.tsv". 

然而,我得到的结果如下:

[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/name1.tsv"

我无法理解为什么在遍历列表时不能使用文件名遍历路径列表。我希望这有助于澄清问题。有人能帮忙吗?

我已经用打印分析了每一条语句,除了下面代码的输出之外,每件事都运行良好

for (i in 1:length(lc)) { 

    for (j in 1:length(lc[[i]])) { # fetch and read files
        if (j==1) {
            newFile <- paste(dataFnsDir, lc[[i]][j], sep="/")
            newFile <- tryCatch(read.delim(newFile, header = TRUE, sep = '/'), error=function(e) NULL)
            newFile<- tryCatch(newFile, error=function(e) data.frame())
            print(tmpFn[i])
        } else {
            newFile <- paste(dataFnsDir, lc[[i]][j], sep="/")
            newFile <- tryCatch(read.delim(newFilei, header = TRUE, sep = '/'), error=function(e) NULL)
            newFile <- tryCatch(newFile, error=function(e) data.frame())
            newFile <- dplyr::bind_rows(newFile, newFile)
            print(tmpFn[i])
        }     
    }
}

共有2个答案

翟淮晨
2023-03-14

如果我理解正确,OP希望从每个列表元素中作为字符向量给出的文件名中创建3个新文件。

OP代码的主要问题是newFile在嵌套循环的每次迭代中都被覆盖。

以下是我对首选工具(未经测试)的看法:

library(data.table)   # for fread() and rbindlist()
library(magrittr)   # use piping for clarity
lapply(
  lc, 
  function(x) {
    filenames <- file.path(dataFnsDir, x)
    lapply(filenames, fread) %>% 
      rbindlist()
  }
)

这将返回三个数据帧(data.tables)的列表。

我没有OP的输入文件,但我们可以模拟效果进行演示。如果我们删除对lappy()的第二个调用,我们将得到一个包含3个元素的列表,每个元素都包含一个文件名的字符向量,路径前面有前缀。

lapply(
  lc, 
  function(x) {
    filenames <- file.path(dataFnsDir, x)
    print(filenames)
  }
)
[[1]]
[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"

[2] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
[3] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"

[4] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/JF_160426_Dep2Plas_tryp_Gpep_SIDtarg-(06)_PSMs.txt"


[[2]]
[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"

[2] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
[3] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"


[[3]]
[1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"

[2] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
dataFnsDir <-"/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA"
lc <- list(
  c("150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt",
    "160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt",
    "JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt",
    "JF_160426_Dep2Plas_tryp_Gpep_SIDtarg-(06)_PSMs.txt"
  ),
  c(
    "150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"  ,
    "160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt",
    "JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"
  ),
  c(
    "150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt",
    "160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
  )
)
令狐增
2023-03-14

不需要使用嵌套循环。试试这个:

# sample data
dataFnsDir <- "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/"
lc <- list()
lc[[1]] <- c("150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt","160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
, "JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"       ,"JF_160426_Dep2Plas_tryp_Gpep_SIDtarg-(06)_PSMs.txt"  
)
lc[[2]] <- c(
"150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"  , "160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt",
"JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"    
)
lc[[3]] <- c(
  "150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt",
"160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
)

# actual code
lc.path.v <- paste0(dataFnsDir,unlist(lc))
# maybe this is what you want?

lc.path.v
#> [1] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"  
#> [2] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
#> [3] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"      
#> [4] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/JF_160426_Dep2Plas_tryp_Gpep_SIDtarg-(06)_PSMs.txt"       
#> [5] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"  
#> [6] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"
#> [7] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/JF_160426_Dep2Plas_ctryp_Gpep_SIDtargFULL__PSMs.txt"      
#> [8] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/150413_JF_GPeps_SIDtarg_GPstdMix_Tryp_2runs_v3_PSMs.txt"  
#> [9] "/home/giuseppa/Development/glycoPipeApp/OUT/openMS/INPUT_DATA/160824_JF_udep_tryp_Hi_SIDdda_FULL_NewParse-(05)_PSMs.txt"

如果您想阅读所有这些数据并将它们组合在一起,请尝试以下方法(这可能不起作用,因为我不知道这些数据是什么样子的):

lc.alldf <- lapply(lc.path, read.delim, header = TRUE, sep = "/")
lc.onedf <- dplyr::bind_rows(lc.alldf)

编辑:代码改进,谢谢@奥尼安布

 类似资料:
  • 问题内容: 我想要一种算法来遍历列表切片。切片大小在功能之外设置,可以不同。 在我看来,这就像: 有没有一种使用python 2.5正确定义的方法或其他方法? edit1:澄清 “分区”和“滑动窗口”这两个术语听起来都适用于我的任务,但是我不是专家。因此,我将更深入地解释该问题并添加到问题中: FatherList是我从文件中获取的一个多级numpy.array。函数必须找到序列的平均值(用户提供

  • 问题内容: 我有两个列表和数字,我想使用相同的指令遍历它们。像这样: 但这感觉多余。我知道我会写,但是要付出一定的时间。 有没有办法做到这一点而又不浪费时间呢? 问题答案: 这可以通过以下方式完成 : 将打印: 根据文档,请执行以下操作: 创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行下一个可迭代对象,直到所有可迭代对象都耗尽为止。 如果列表中有列表, 则可用: 产

  • 本文向大家介绍common-lisp 遍历列表,包括了common-lisp 遍历列表的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用~{和~}指令遍历列表。 ~^ 如果没有更多元素了,可以用来转义。 可以使用数字参数~{来限制可以执行的迭代次数: ~@{ 将遍历其余参数,而不是列表: 子列表可以使用~:{以下命令进行迭代:            

  • 问题内容: 我有一个列表-myList-每个元素都是一个字典。我希望遍历此列表,但是每次只在每本词典中使用一个属性-“ age”来表示有趣。我也对保持迭代次数感兴趣。 我做: 但是我想知道是否还有更多的pythonic。有小费吗? 问题答案: 您可以使用生成器仅获取年龄。 而且,是的,不要使用分号。

  • 问题内容: 我有以下对象和地图: 我想将地图转换成另一个地图。结果图的键是输入图的键。结果映射的值是My对象的属性“名称”,按优先级排序。 该 排序 和提取的名字是没有问题的,但我不能把它放到结果地图。我使用旧的Java 7方法进行操作,但是可以使用流API会很好。 有人知道吗?我试过了,但是被卡住了: 问题答案: 本质上,您将流式传输每个条目集并将其收集到新映射中。要计算新地图中的值,请从旧地图

  • 问题内容: 我从Web服务返回一个List <>作为JSON对象的列表。我正在尝试使用一个for循环来遍历列表并从属性中获取值。这是返回的JSON的示例: 因此,我尝试使用类似以下的方法提取内容: 应该怎么做? 问题答案: 今天遇到了同样的问题,您的话题对我有所帮助,所以这里找到解决方法;