【问题标题】:use apply file list for a function in R对 R 中的函数使用应用文件列表
【发布时间】:2021-09-24 11:35:37
【问题描述】:

我创建了这个函数来从两个不同的文件中获取一些信息

   create_distance_to_strand <- function(data, data2, nameCsv) {
      newData  <- data  %>% 
        select(seqnames, start, end, V4, seqnames, geneStart, geneEnd, geneStrand, distanceToTSS, SYMBOL, geneLength)%>%
        rename(peak = V4)
      
      joined_df <- merge(newData , closest_dist, by.x = "peak", 
                         by.y = "peak", all.x = TRUE, all.y = TRUE) %>% drop_na()
      
      write.table(joined_df , nameCsv, sep = "\t")
    
      
      return(joined_df)
    }
    
    closest_dist = read.csv("closest_distance", header = T, sep ="\t")
    annotation = read.csv("results_annotation", header = T, sep ="\t") 
    myDistanceToStrand <- create_distance_to_strand(annotation,  closest_dist, "frame.csv")

它按预期工作。但是,如果我有不同的"closest_dist" 文件,我会尝试使其更高效,以便将该功能应用于所有文件。 我试过这个:

    files <- list.files(pattern = "closest*")
    proof = lapply(files, create_distance_to_strand(annotation,  closest_dist, "proof.csv"))

但是不行

Error in h(simpleError(msg, call)) : 
      error in evaluating the argument 'y' in selecting a method for function 'merge': object 'closest_dist' not found 

有什么建议吗? 谢谢

【问题讨论】:

标签: r function lapply


【解决方案1】:

由于files中保存有不同的closest_dist文件,可以使用lapply一一传递。我们可以在这里使用匿名函数 -

files <- list.files(pattern = "closest*")
proof = lapply(files, function(x) create_distance_to_strand(annotation,  x, "proof.csv"))

要获得单独的输出文件,您也可以传递不同的nameCsv 值。

Map(function(x, y) create_distance_to_strand(annotation, x, y), 
    files, sprintf('proof%d.csv', seq_along(files)))

【讨论】:

  • 我很遗憾忘记了匿名函数。但是,它只生成一个 csv,而不是每个文件一个。关于如何解决它的任何想法?谢谢!
  • @lana 因为您正在覆盖同一个文件 - proof.csv。使用 paste0,创建文件,如 proof1.csv proof2.csv 等
  • 是的,那是因为我们在每次迭代中都传递了相同的文件名“proof.csv”。您可以创建一个文件名向量并使用Map 单独传递它。查看更新的答案。
  • 确实,谢谢你的信息!!!!
猜你喜欢
  • 2019-07-13
  • 2015-04-19
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
相关资源
最近更新 更多