2012-05-09 2 views
0

Надеюсь, что кто-то может опубликовать пример пользовательской функции, которая действует как «.». в plyr.Создание аналогичной функции для "." от Plyr

У меня есть кадр данных. Где я постоянно выполняющиеся запросы, такие как:

sqldf("select * from event.df where Date in (select Date from condition.df where C_1 = 1 and (C_2 = 1 OR C_3 = 3)") 

То, что я хотел бы, чтобы иметь функцию, которая в основном действует следующим образом:

.(C_1, C_2 + C_3) 

В частности, вектор формул, которые определяют атрибуты, которые я использую для выбора моих данных. Я могу рассматривать «+» как OR «*» как AND и т. Д.

Я попытался посмотреть тип возврата для "." от plyr, но не понял.

ответ

6

Функция аналогична plyr:::. является plyr:::.:

plyr:::. 
function (..., .env = parent.frame()) 
{ 
    structure(as.list(match.call()[-1]), env = .env, class = "quoted") 
} 
<environment: namespace:plyr> 

Это возвращает список и присваивает ему класс «в кавычках». Все, что он делает, - это сопоставление аргументов .() с именами столбцов в окружении. Попробуйте это в другом контексте:

with(iris, .(Sepal.Length, Species)) 
List of 2 
$ Sepal.Length: symbol Sepal.Length 
$ Species  : symbol Species 
- attr(*, "env")=<environment: 0x2b33598> 
- attr(*, "class")= chr "quoted" 

Что вы делаете с этим объектом дальше, зависит от вашей цели. Существует несколько методов для работы с этим классом:

methods(class="quoted") 
[1] as.quoted.quoted* c.quoted*   names.quoted*  print.quoted*  [.quoted*   

    Non-visible functions are asterisked 

Так что, если вы ищете функции, как .(), возможно, вы можете просто использовать .()

+0

Имена может реально помочь! Кто-нибудь будет знать, как ddply лечит. (A + b), просто ли он разделяет строку на всех токенах, кроме «+»? – Dave

+0

Что вы имеете в виду, сопоставляя столбцы с окружающей средой? – Dave

0
parse <- function (formula, blank.char = ".") 
{ 
    formula <- paste(names(formula), collapse = "") 
    vars <- function(x) { 
     if (is.na(x)) 
      return(NULL) 
     remove.blank(strsplit(gsub("\\s+", "", x), "[*+]")[[1]]) 
    } 
    remove.blank <- function(x) { 
     x <- x[x != blank.char] 
     if (length(x) == 0) 
      NULL 
     else x 
    } 
    parts <- strsplit(formula, "\\|")[[1]] 
    list(m = lapply(strsplit(parts[1], "~")[[1]], vars), l = lapply(strsplit(parts[2], "~")[[1]], vars)) 
} 

parse(.(a + b ~ c + d | e)) 

    $m 
$m[[1]] 
[1] "a" "b" 

$m[[2]] 
[1] "c" "d" 


$l 
$l[[1]] 
[1] "e" 
+2

Вы, вероятно, не хотите перезаписывать 'base ::: parse' – Gregor

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