需要帮助将for循环转换为lapply或sapply吗

需要帮助将for循环转换为lapply或sapply吗,r,R,我正在研究R并学习如何编码。我已经使用for循环编写了一段代码,我发现它非常慢。我想知道我是否可以得到一些帮助,将其转换为使用sapply或lappy函数。这是我的工作代码: library(dplyr) pollutantmean <- function(directory, pollutant, id = 1:332) { files_list <- list.files(directory, full.names=TRUE) #creates a list

我正在研究R并学习如何编码。我已经使用for循环编写了一段代码,我发现它非常慢。我想知道我是否可以得到一些帮助,将其转换为使用sapply或lappy函数。这是我的工作代码:

library(dplyr)
pollutantmean <- function(directory, pollutant, id = 1:332)   {
      files_list <- list.files(directory, full.names=TRUE)   #creates a list of files
      dat <- data.frame()                             #creates an empty data frame
      for (i in seq_along(files_list)) {
            #loops through the files, rbinding them together
            dat <- rbind(dat, read.csv(files_list[i]))
      }
      dat_subset <- filter(dat, dat$ID %in% id) #subsets the rows that match the 'ID' argument
      mean(dat_subset[, pollutant], na.rm=TRUE)      #identifies the Mean of a Pollutant
}

pollutantmean("specdata", "sulfate", 1:10)

返回此代码几乎需要20秒,这对于332条记录来说是不可接受的。想象一下,如果我有一个包含10K条记录的数据集,并且想要得到这些变量的平均值

您可以使用do.call查找列表中的所有元素,并使用lappy将所有文件读入该列表:


代码之所以缓慢,是因为您在循环中以增量方式增长数据帧。使用来自purrr的dplyr和map_df实现这一点的一种方法是


如果这是针对Coursera R编程课程,请在此处搜索[R]pollutantmean,您将找到几十篇具有良好解决方案的帖子。谢谢您的推荐和建议,但是,$pollutant在RCR中生成意外标记错误后的昏迷将是一个打字错误,如果没有可复制的数据块,很难判断,抱歉
mean(
  filter( # here's the filter that will be applied to the rbind-ed data
    do.call("rbind", # call "rbind" on all elements of a list 
            lapply( # create a list by reading in the files from list.files()
              # add any necessary args to read.csv:
              list.files("[::DIR_PATH::]"), function(x) read.csv(file=x, ...)
            ) 
    )
  ), ID %in% id)$pollutant, # make sure id is replaced with what you want
na.rm = TRUE
)
library(dplyr)
pollutantmean <- function(directory, pollutant, id = 1:332)   {

    files_list <- list.files(directory, full.names=TRUE)  
    purrr::map_df(files_list, read.csv) %>%
                  filter(ID %in% id) %>%
                  summarise_at(pollutant, mean, na.rm = TRUE)

}