r - 更改 for 循环以覆盖多个文件

标签 r for-loop dataframe lapply

我有很多 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)
    }}}

我知道这很简单,但我不明白。任何帮助将非常感激。 谢谢。 保拉。

最佳答案

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

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)

关于r - 更改 for 循环以覆盖多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28731074/

相关文章:

c - For 循环 - 将无符号数与有符号整数进行比较

python - 从 MultiIndex 的 DataFrame 中提取数据

Python Pandas 匹配数据帧

R 列表的交集

r - 为什么 10 的幂以科学记数法打印为 5 次方?

c++ - 为什么使用迭代器而不是数组索引?

java - 我怎样才能简化这个奇数代码?

r - 如何解决R Studio中的 'protection stack overflow'问题

通过data.table non-equi join的相对窗口运行总和

r - 基于原始 CSV 文件名称的地 block 名称