【问题标题】:changing for loop to lapply over several files更改 for 循环以覆盖多个文件
【发布时间】:2015-04-28 03:48:05
【问题描述】:

我有很多 csv 文件,我需要读取所有这些文件并在变量中执行一些操作。我使用了“for 循环”,但耗时太长。我在这里搜索了很多答案,我知道 lapply 会更有效率,但我无法实现。有人可以帮我吗? 一个文件示例是:

ID  Estimate       SE        avar    h2 
683 6.17E-02       1.226     1.11   0.19
52  -1.77E-02      1.278    1.11    0.19

我有近 50 个格式相同但名称不同的文件。我要做的是读取所有文件,创建一个名为 rel 的变量,即:1 -(SE^2)/avar。之后,我想根据变量 rel 对数据进行子集化并编写新文件。我试过的是:

 myfiles <- list.files(pattern=".csv")

    for (j in 1:length(myfiles)) {
        this_file <- read.csv(myfiles[j], header = T)
        for (i in this_file) {
               for (k in 1:dim(this_file)){
              this_file["rel"] = 1-((this_file["SE"]*this_file["SE"])/this_file["avar"])
              this_file <- subset(this_file, this_file["rel"] >= 0.8*this_file["h2"])

      write.csv(this_file, file=this_file)
    }}}

我知道这很简单,但我不明白。任何帮助将不胜感激。 谢谢你。 宝拉。

【问题讨论】:

  • 请说明您在阅读每个 csv 文件后要执行的操作。
  • 谢谢@Metrics。我已经做到了。
  • 当您说它们有不同的名称时,您是指文件还是每个文件中的列?
  • 文件@Richard Scriven。就像:cat.csv; dog.csv 等。所有文件都具有相同的变量名称(ID、Estimate、SE、avar 和 h2)。
  • 好的,我建议您将子集数据发送到新文件,这样您就不会覆盖原始数据

标签: r for-loop dataframe lapply


【解决方案1】:

这应该让你接近。我将使用新的文件名向量,这样我们就不会覆盖您当前的文件。

myfiles <- list.files(pattern = "\\.csv$")

## make a vector of new file names 'cat*.csv' where * is 1:length(myfiles)
newfiles <- sprintf("cat%d.csv", seq_along(myfiles))

Map(function(x, y) {
        df <- read.table(x, header = TRUE)
        df$rel <- with(df, 1 - (SE^2 / avar))
        write.table(df[df$rel >= (0.8 * df$h2), ], file = y)
    }, x = myfiles, y = newfiles)

【讨论】:

  • 谢谢@RichardScriven。但是当我运行它时,我收到以下消息: $CGRM.csv NULL
  • 这是write.csv 使用mapply() 时的输出。看看新文件,里面应该有一些数据
  • 对不起。我的文件是数据框。但它看起来像它没有阅读。谢谢。
  • 糟糕,没有注意到您将示例文件放在帖子中。 read.table() 就是你想要的
  • 你可以使用mapply而不是Map
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
相关资源
最近更新 更多