如何改进此R功能

时间:2015-04-19 12:16:02

标签: r

我是R.的新手。我创建了下面的函数来计算332 csv文件中包含的数据集的平均值。寻求有关如何改进此代码的建议。运行需要38秒才能让我觉得效率不高。

pollutantmean <- function(directory, pollutant, id = 1:332) {
        files_list <- list.files(directory, full.names = TRUE) #creats list of files
        dat <- data.frame() #creates empty dataframe
                for(i in id){
                        dat<- rbind(dat,read.csv(files_list[i])) #combin all the monitor data together
}
        good <- complete.cases(dat) #remove all NA values from dataset
        mean(dat[good,pollutant]) #calculate mean
} #run time ~ 37sec - NEED TO OPTIMISE THE CODE

2 个答案:

答案 0 :(得分:4)

不是每次使用data.frame创建空格rbindfor loop,您都可以将所有data.frames存储在列表中并一次合并它们。您还可以使用均值函数的na.rm选项,不要考虑NA值。

pollutantmean <- function(directory, pollutant, id = 1:332)
{
    files_list = list.files(directory, full.names = TRUE)[id] 
    df         = do.call(rbind, lapply(files_list, read.csv))

    mean(df[[pollutant]], na.rm=TRUE)
}

可选 - 我会使用magrittr增加可读性:

library(magrittr)

pollutantmean <- function(directory, pollutant, id = 1:332)
{
    list.files(directory, full.names = TRUE)[id] %>%
        lapply(read.csv) %>%
        do.call(rbind,.) %>%
        extract2(pollutant) %>%
        mean(na.rm=TRUE)
}

答案 1 :(得分:1)

您可以使用data.table fread函数来改进它(请参阅Quickly reading very large tables as dataframes in R) 使用data.table::rbindlist绑定结果也更快。

require(data.table)    

pollutantmean <- function(directory, pollutant, id = 1:332) {
    files_list = list.files(directory, full.names = TRUE)[id]
    DT = rbindlist(lapply(files_list, fread))
    mean(DT[[pollutant]], na.rm=TRUE) 
}