2017-02-05 6 views
1

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

Моя проблема с гибким входом в «агрегат», который разбомбить по причинам, я не могу понять:

group variable “grp” 
str(grp) 
'data.frame': 1573 obs. of 1 variable: 
$ Loc: Factor w/ 4 levels "ED","ICU","Trans",..: 1 1 1 1 1 1 1 1 1 4 ... 

Time variable 
TimeBase <- “year” 

data 
str(tmp) 
'data.frame': 554 obs. of 4 variables: 
$ Loc  : Factor w/ 4 levels "ED","ICU","Trans",..: 4 1 1 1 4 4 1 1 4 4 ... 
$ year : Factor w/ 7 levels "2011","2012",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ ActivLag: num 3 -2 0 1 17 210 19 -7 0 107 ... 
$ ScanLag : num 80 12 5 8 159 255 28 109 11 111 ... 

aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), na.rm = TRUE, na.action = na.pass) 

это работает отлично, если = Деловые отношения «означают», но если = «Деловые отношения суммы ", Который не принимает na.rm в качестве аргумента, он не работает. Итак, я попытался следующий:

statstrg <- ifelse(stvar %in% c("sum", "prop","frel", "median"), " na.action = na.pass", " na.rm = TRUE, na.action = na.pass") 
aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), paste0(statstrg)) 

, который не работает и выдает ошибку follwoing:

Error in if (na.rm) x <- x[!is.na(x)] else if (any(is.na(x))) return(x[FALSE][NA]) : 
argument is not interpretable as logical 

Даже если

aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), na.action = na.pass) 

ДЕЛАЕТ работу для Деловых отношений = «суммы».

Использование условного назначения строк и вставки (var) для каждого из na.rm и na.action = na.pass не работает, так как нет возможности обрабатывать запятые, необходимые для агрегирования, для анализа аргументов. Я попытался передать различные комбинации аргументов в paste(), но агрегат хочет видеть отдельные аргументы. Так может ли кто-нибудь указать мне на метод, который может работать лучше? спасибо.

+0

Функция 'sum()' также принимает этот аргумент 'na.rm = T/F' bdw –

ответ

0

Хотя формулы могут быть динамически генерироваться со строками, параметры задание в функции не может быть построено из строки, таких как необязательные аргументы, na.rm и na.action в aggregate() значение которых по умолчанию является NULL.

Рассмотрит условно назначая два различных aggregate() вызовов в зависимости от Деловых отношений:

if (stvar %in% c("sum", "prop", "frel", "median")) { 
    aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
         FUN = stvar, na.action = na.pass) 
} else { 
    aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
         FUN = stvar, na.rm = TRUE, na.action = na.pass) 
} 

В качестве альтернативы присвоить переменную st_narm условно TRUE или NULL, который требует использования if вместо ifelse, так как вы не можете присвоить пустое объект к значению (сбой длины замены).

if(stvar %in% c("sum", "prop","frel", "median")){ 
    st_narm <- NULL 
} else { 
    st_narm <- TRUE 
} 

aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
        FUN = stvar, na.rm = st_narm, na.action = na.pass) 
0

Спасибо за хорошие предложения! Проблема решена, но для каждого из них необходимо выполнить все:

1) «aggregate» не принимает sum() в качестве аргумента, а только «sum» и na.rm передается из «совокупности», а не суммы() и выдаст ошибку, если одновременно будут переданы суммы и na.rm.

2) Метод if-then st_narm < - NULL все еще дал мне ошибку: Ошибка в if (na.rm) x < - x [! Is.na (x)] else if (any (is.na (x))) return (x [FALSE] [NA]): аргумент имеет длину 0. Так не получилось.

3) Условные с полными «агрегатными» строками хорошо работали, хотя и кажутся менее изящными. Но, выполняет свою работу.

Thx еще раз.Должен любить сообщество с открытым исходным кодом!

+0

Отлично. И я тестировал оба решения по выборке данных, и оба работали. Это должно быть конкретное значение конкретной ошибки. Какой совокупный fct. вызывает ошибку: * sum *, * median *, * quantile * и т. д.? Возможно, попробуйте * FALSE * вместо * NULL *. Кроме того, это не строки, а 'aggregate()' вызовы методов. – Parfait

Смежные вопросы