R: Разделение-применение-объединение функций применения посредством агрегирования в кадры данных с привязкой к ряду, подмножество по классам

Обновление: функции данных моей метеостанции NOAA GHCN-Daily были очищены и объединены в пакет rnoaa, доступный в CRAN или здесь: https://github.com/ropensci/rnoaa

Я разрабатываю функцию R для расчета статистики по набору данных, состоящему из нескольких кадров данных. Короче говоря, я хочу получить фреймы данных по классам на основе эталонного фрейма данных, содержащего имена. Затем я хочу применить статистические функции к значениям показателей, перечисленных для каждого заданного дня. По сути, я хочу вызвать, а затем наложить список фреймов данных для вычисления функций вектора значений для каждой уникальной даты и метрики, где значения не являются NA.

Кадры данных итеративно считываются в рабочую область из файла на основе переменной класса с использованием функции «by». После импорта файлов для данного класса я хочу rbind() фреймы данных для этого класса и каждой определяемой пользователем метрики в пределах диапазона лет. Затем я хочу применить конкатенацию предоставленных пользователем статистических функций к каждой метрике в классе, которая соответствует заданному значению для года, месяца и дня (т. е. средняя [функция] низкая температура [класс] 1 июля, 1990 [дата] сообщается во всех местоположениях [кадры данных] в заданном регионе [класс]. Я хочу, чтобы конечным результатом были новые кадры данных, содержащие значения для каждой даты в регионе и диапазон лет для каждой метрики и статистической функции. Я очень близок к получению этого результата с помощью функции агрегата(), но у меня возникают проблемы с получением разумных результатов из функции агрегата, которая в настоящее время выводит NA и NaN для большинства функций, отличных от средней температуры.Любой совет будет очень полезен. оценил!Вот мой код до сих пор:

# Example parameters
w <- c("mean","sd","scale")             # Statistical functions to apply
x <- "C:/Data/"                         # Folder location of CSV files
y <- c("MaxTemp","AvgTemp","MinTemp")   # Metrics to subset the data
z <- c(1970:2000)                       # Year range to subset the data

 CSVstnClass  <- data.frame(CSVstations,CSVclasses)

  by(CSVstnClass, CSVstnClass[,2], function(a){                        # Station list by class
  suppressWarnings(assign(paste(a[,2]),paste(a[,1]),envir=.GlobalEnv))
    apply(a, 1, function(b){                                           # Data frame list, row-wise
      classData   <- data.frame()
      sapply(y, function(d){                                           # Element list
        CSV_DF    <- read.csv(paste(x,b[2],"/",b[1],".csv",sep=""))    # Read in CSV files as data frames
        CSV_DF1   <- CSV_DF[!is.na("Value")]
        CSV_DF2   <- CSV_DF1[which(CSV_DF1$Year %in% z & CSV_DF1$Element == d),]
        assign(paste(b[2],"_",d,sep=""),CSV_DF2,envir=.GlobalEnv)

        if(nrow(CSV_DF2) > 0){                                         # Remove empty data frames
          classData <<- rbind(classData,CSV_DF2)                       # Bind all data frames by row for a class and element
          assign(paste(b[2],"_",d,"_bound",sep=""),classData,envir=.GlobalEnv)

          sapply(w, function(g){                                       # Function list
                                                                       # Aggregate results of bound data frame for each unique date
            dataFunc <- aggregate(Value~Year+Month+Day+Element,data=classData,FUN=g,na.action=na.pass)
            assign(paste(b[2],"_",d,"_",g,sep=""),dataFunc,envir=.GlobalEnv)
            })
        }
        })
      })
    })

Я думаю, что я довольно близок, но я не уверен, что rbind() работает правильно, и почему функцияaggregation() выводит NA и NaN для такого количества показателей. Я был обеспокоен тем, что фреймы данных не были связаны друг с другом или что пропущенные значения плохо обрабатывались некоторыми статистическими функциями. Заранее благодарим вас за любой совет, который вы можете предложить.

Ваше здоровье,

Адам


person Adam Erickson    schedule 26.07.2013    source источник
comment
есть ли опечатка в этом DFbound ‹‹- do.call(rbind,lapply(paste(b[1],_,d,sep=),FUN=get)) почему 2 ‹‹ ?   -  person user2510479    schedule 27.07.2013
comment
<<- является глобальным назначением. Это законная, но крайне нежелательная функция.   -  person Señor O    schedule 27.07.2013
comment
не видел ‹‹ - слишком часто, спасибо за ответ @Senor O   -  person user2510479    schedule 27.07.2013
comment
На самом деле это не совсем точно. На странице 47 Введения в R в CRAN специальный оператор присваивания ‹‹- ищет во вложенных средах среду, содержащую символ, и когда находит такую ​​среду, заменяет значение в этой среде со значением правой стороны. Если глобальная среда или среда верхнего уровня достигнута без нахождения символа, то эта переменная создается и назначается там. Таким образом, будет найден пустой список, который я создал несколькими средами выше. С вложенными списками все обстоит куда более странно (например, x$x$x).   -  person Adam Erickson    schedule 27.07.2013


Ответы (1)


Вы решили эту проблему таким образом, что ее очень трудно отлаживать. Я бы порекомендовал поменять местами, чтобы вам было легче проверять каждый шаг. (Также помогает использование информативных имен переменных!) Код вряд ли будет работать как есть, но гораздо проще работать итеративно, проверяя успешность каждого шага, прежде чем переходить к следующему.

paths <- dir("C:/Data/", pattern = "\\.csv$")

# Read in CSV files as data frames
raw <- lapply(paths, read.csv, str)

# Extract needed rows
filter_metrics <- c("MaxTemp", "AvgTemp", "MinTemp")
filter_years <- 1970:2000
filtered <- lapply(raw, subset, 
  !is.na(Value) & Year %in% filter_years & Element %in% filter_metrics)

# Drop any empty data frames
rows <- vapply(filtered, nrow, integer(1))
filtered <- filtered[rows > 0]

# Compute aggregates
my_aggregate <- function(df, fun) {
  aggregate(Value ~ Year + Month + Day + Element, data = df, FUN = fun, 
    na.action = na.pass)
}    
means <- lapply(filtered, my_aggregate, mean)
sds <- lapply(filtered, my_aggregate, sd)
scales <- lapply(filtered, my_aggregate, scale)
person hadley    schedule 01.08.2013
comment
Хэдли, большое спасибо, что уделили этому внимание. Я буду работать с приведенными выше предложениями и опубликую обновление после дополнительной отладки. Еще раз спасибо! - person Adam Erickson; 01.08.2013
comment
Обновление: функции данных моей метеостанции NOAA GHCN-Daily с тех пор были очищены и объединены в пакет rnoaa, доступный в CRAN или здесь: github.com/ropensci/rnoaa - person Adam Erickson; 22.09.2015