2015-04-20 2 views
0

Я пытаюсь написать функцию, которая вернет среднее значение столбцов для нескольких CSV-файлов. Однако функция, кажется, застрял с моим средним расчетом, так как она возвращает NA значения:Создание функции среднего значения, возвращающее сообщение об ошибке NAs

pollutantmean <- function(directory, pollutant, id = 1:332){ 
    dy <- list.files("specdata", full.names = T) 
    df <- data.frame() 
    for(i in id){ 
    rbind(df,read.csv(dy[i])) 
    } 
    if(pollutant == "nitrate"){mean(df$nitrate, na.rm = TRUE)} 
    if(pollutant == "sulfate"){mean(df$sulfate, na.rm = TRUE)} 
} 

Предложения по решению этой проблемы весьма признателен.

+0

Вы, безусловно, можете найти полезные ссылки здесь: http://stackoverflow.com/search?tab=newest&q=[r]%20pollutantmean –

+1

Я считаю, что поведение по умолчанию read.csv по умолчанию - игнорировать заголовок. Если он не получит имена, тогда он не будет знать, что такое df $ нитрат. Возможно, попробуйте добавить 'header = T' в часть read.csv? – goodtimeslim

+0

@goodtimeslim Он получает 'header'. 'head (read.csv ('001.csv'), 2) # Дата сульфата нитрата ID 1 2003-01-01 NA NA 1 2 2003-01-02 NA NA 1' – akrun

ответ

1

Попробуйте явно возвращаются средние значения из пользовательской функции, как это:

pollutantmean <- function(directory, pollutant, id = 1:332) { 
    dy <- list.files("specdata", full.names=TRUE) 
    df <- data.frame() 
    for (i in id) { 
     df <- rbind(df, read.csv(dy[i])) 
    } 
    if(pollutant == "nitrate") { return(mean(df$nitrate, na.rm=TRUE)) } 
    if(pollutant == "sulfate") { return(mean(df$sulfate, na.rm=TRUE)) } 
} 

Если это не устранит проблему, то вы, вероятно, есть столбцы кадров данных, которые содержат символьные данные, в результате чего R, чтобы дать вам NA значений. Вставьте эти две строки в функции pollutantmean, чтобы увидеть ли вы имеете дело с числовыми столбцами:

print(class(df$nitrate)) 
print(class(df$sulfate)) 

Если вы видите «фактор», или что-нибудь другое, чем числовые, то вы будете знать, что ваш ввод данных содержит нечто иное, чем чистые числа.

+0

Спасибо за уловку ... Я пропустил это^^ –