【问题标题】:How can I create a loop to make my code more efficient in R?如何创建循环以使我的代码在 R 中更高效?
【发布时间】:2021-06-01 06:30:02
【问题描述】:

对不起,我是 R 新手。

基本上,我试图在多个小时内获取每小时记录多次的声学指数的平均小时值,并将它们一起保存在一个数据框中。

这是前 2 小时的代码:

mean_aci <- mean(aci_results$LEFT_CHANNEL)
adi_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy/adi_results.csv")
mean_adi <- mean(adi_results$LEFT_CHANNEL)
aei_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy/aei_results.csv")
mean_aei <- mean(aei_results$LEFT_CHANNEL)
H_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy/H_results.csv")
mean_H <- mean(H_results$LEFT_CHANNEL)
ndsi_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy/ndsi_results.csv")
mean_ndsi <- mean(ndsi_results$LEFT_CHANNEL)

data1 <- data.frame(aci = mean_aci,
                    adi = mean_adi,
                    aei = mean_aei,
                    H = mean_H,
                    ndsi = mean_ndsi)

aci_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (2)/aci_results.csv")
mean_aci <- mean(aci_results$LEFT_CHANNEL)
adi_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (2)/adi_results.csv")
mean_adi <- mean(adi_results$LEFT_CHANNEL)
aei_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (2)/aei_results.csv")
mean_aei <- mean(aei_results$LEFT_CHANNEL)
H_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (2)/H_results.csv")
mean_H <- mean(H_results$LEFT_CHANNEL)
ndsi_results <- read.csv("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (2)/ndsi_results.csv")
mean_ndsi <- mean(ndsi_results$LEFT_CHANNEL)

new_row <- c(mean_aci, mean_adi, mean_aei, mean_H, mean_ndsi)
data1 <- rbind(data1, new_row)

上面的代码已经成功地实现了我的目标,但是我的问题是每个小时都保存在一个不同的文件中,其中的数字对应于记录的小时数(即小时 - 复制,小时 - 复制(2),小时- 复制 (3) ... 小时 - 复制 (147))。

每次手动更改每个文件的数字 +1 似乎非常耗时且乏味,尤其是考虑到我有多个站点,总共有数百小时的数据。

我想知道是否有任何循环可以将 .csv 文件的文件夹每次更改为 +1?

很抱歉解释冗长

【问题讨论】:

    标签: r loops csv


    【解决方案1】:

    我们可以把所有的文件都拿到list,读取它并得到mean

    file_path <-  "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy/"
    
    
    files <- list.files(path = file_path, 
            full.names = TRUE, pattern = "\\.csv$")
    lst1 <- lapply(files, function(x) read.csv(x))
    out <- sapply(lst1, function(x) mean(x$LEFT_CHANNEL, na.rm = TRUE))
    

    似乎我们需要自动化文件路径,即paste末尾的数字。可以在函数中完成

    f1 <- function(path, n) {
          file_path <- sprintf('%s (%d)', path, n)
          files <- list.files(path = file_path, 
             full.names = TRUE, pattern = "\\.csv$")
           tmp <- lapply(files, read.csv)
          sapply(tmp, function(x) mean(x$LEFT_CHANNEL, na.rm = TRUE))
     }
    

    如果默认情况下没有任何要添加的内容。我们在函数之外做

    rbind(out, do.call(rbind, lapply(2:10, f1)))
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2020-12-02
      • 2021-09-15
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多