Объединение выражений для подмножества данных - PullRequest
2 голосов
/ 03 апреля 2011

Я пытаюсь создать функцию, которая будет вычислять среднее значение столбца в подмножественном кадре данных.Хитрость заключается в том, что я всегда хочу иметь пару условий поднабора, а затем иметь возможность передать дополнительные условия функциям для дальнейшего поднабора кадра данных.

Предположим, мои данные выглядят так:1004 *

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

subset(dat, var1 %in% c('a', 'b', 'c') & var2 %in% c('a', 'b'))
   var1 var2      var3
1     a    a 0.7506109
2     b    a 0.7763748
3     c    a 0.6014976
27    a    b 0.7322357
28    b    b 0.4593551
29    c    b 0.2951004

Мой пример функции и функциивызов будет выглядеть примерно так:

getMean <- function(expr) {  
  return(with(subset(dat, var1 %in% c('a', 'b', 'c') eval(expr)), mean(var3)))  
}
getMean(expression(& var2 %in% c('a', 'b')))

Альтернативный вызов может выглядеть следующим образом:

getMean(expression(& var4 < 6 & var5 > 10))

Любая помощь очень ценится.


РЕДАКТИРОВАТЬ: С помощью Войцеха Собалы я придумал следующую функцию, которая дает мне возможность проходить в 0 или более условиях.

getMean <- function(expr = NULL) {
  sub <- if(is.null(expr)) { expression(var1 %in% c('a', 'b', 'c'))
  } else expression(var1 %in% c('a', 'b', 'c') & eval(expr))
  return(with(subset(dat, eval(sub)), mean(var3)))
}
getMean()
getMean(expression(var2 %in% c('a', 'b')))

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Это можно упростить с помощью defalut expr = TRUE.

getMean <- function(expr = TRUE) {
  return(with(subset(dat, var1 %in% c('a', 'b', 'c') & eval(expr)), mean(var3)))
}
1 голос
/ 03 апреля 2011

Вот как бы я подошел к этому. Функция getMean использует удобные настройки параметров R по умолчанию:

getMean <- function(x, subset_var1, subset_var2=unique(x$var2)){
    xs <- subset(x, x$var1 %in% subset_var1 & x$var2 %in% subset_var2)

    mean(xs$var3)
}

getMean(dat, c('a', 'b', 'c'))
[1] 0.4762141

getMean(dat, c('a', 'b', 'c'), c('a', 'b'))
[1] 0.3814149
...