2017-01-23 13 views
1

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

testfunc <- function(dfrm, varq, factor, gear = FALSE, 
        am = FALSE, carb = FALSE){ 
    # Subset the data according to the arguments: 
    subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) & 
          (dfrm[,"am"] %in% am) & 
          (dfrm[,"carb"] %in% carb)),] 

    # Grab the groups to be compared according to arguments: 
    factorbinary <- get(factor) 

    # The t-test: 
    t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq], 
       dfrm[which(dfrm[factor]==factorbinary[2]), varq], 
       data = subsetdfrm) 
    print(t) 
} 

Здесь функция в действии, сравнивая автомобили с 3-х передач против автомобилей с 4-мя передачами, глядя на автоматический (Am = 0) автомобили с 2 до 4 карбюраторов:

testfunc(mtcars, "mpg", "gear", gear = c(3,4), am = 0, carb = c(2:4)) 

Обратите внимание, что я определил значения по умолчанию для аргументов как «FALSE». Я хочу найти значение по умолчанию для этих аргументов, которое автоматически отрицает подмножество, что означает, что все значения включены. Мое лучшее решение было добавить, если() положения для каждого из аргументов в начале функции как таковой:

if(carb == FALSE){gear <- unique(dfrm$gear)} 
if(am == FALSE){am <- unique(dfrm$am)} 
if(carb == FALSE){carb <- unique(dfrm$carb)} 

Это будет трудно управлять, как только число параметров увеличивается. Есть ли значение по умолчанию, на которое я могу установить свои аргументы, что приведет к отрицанию подмножества?

Я представляю что-то, что эквивалентно противоположному объекту NULL: «не-NULL» или подстановочный объект, который просто равен всем. Если нет, могу ли я изменить свой код, чтобы использовать объект NULL на этапе подмножества?

Ищет ключевые слова «все», «любые» и «подмножество», как правило, ссылаются на страницы, ссылающиеся на функции all() и any(), и не получили меня дальше. Буду признателен за любую помощь, спасибо.

+1

Если у вас есть вектор индексов строк (например, 'which' возвращает), вы можете отменить их с помощью' -', выбрав дополнение. См. Https://cran.r-project.org/doc/manuals/R-intro.html – Frank

+1

О, я вижу, вы имеете в виду * не * подмножество. Для этого вы можете просто написать 'gear = unique (dfrm $ gear)' внутри 'function (...)' part. Благодаря ленивой оценке R, он будет оценивать этот термин только тогда, когда он необходим внутри функции. – Frank

+0

Какой модуль мы ищем? Это очень длинная страница, возможно, я могу использовать ctrl-F для ключевого слова, которое приведет меня в раздел, на который вы ссылаетесь? – naco

ответ

0

При участии Франка в комментариях, вот рабочий раствор:

testfunc <- function(dfrm, varq, factor, gear = unique(dfrm$gear), 
        am = unique(dfrm$am), carb = unique(dfrm$carb)){ 
    # Subset the data according to the arguments: 
    subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) & 
          (dfrm[,"am"] %in% am) & 
          (dfrm[,"carb"] %in% carb)),] 

    # Grab the groups to be compared according to arguments: 
    factorbinary <- get(factor) 

    # The t-test: 
    t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq], 
       dfrm[which(dfrm[factor]==factorbinary[2]), varq], 
       data = subsetdfrm) 
    print(t) 
} 

В моем исходном коде, вместо dfrm, у меня есть FilePath, который импортируется в dfrm по read.csv(). Кажется, что у функции нет проблем с обработкой того факта, что «dfrm», упоминаемый в аргументах, появляется позже в курсе.