do.call-подобная функция для бинарных операторов в R - PullRequest
5 голосов
/ 14 февраля 2012

Есть ли в R встроенная функция для вызова бинарных операторов / функций над списком или фреймом данных?

Возьмем, к примеру, фрейм данных с тремя логиками:

set.seed(10)
foo <- matrix(as.logical(round(runif(24))), ncol = 3)
foo <- as.data.frame(foo)

Теперь я хотел бы сделать что-то вроде этого:

do.call.bin("|", foo)

, чтобы он применял оператор or ко всем столбцам, получая:

[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

Возможная реализация может быть:

do.call.bin <- function (fun.bin, lst) {
    fun.bin <- match.fun(fun.bin)
    if (length(lst) > 2) {
        ret <- fun.bin(lst[[1]], Recall(fun.bin, lst[-1]))
    } else {
        ret <- fun.bin(lst[[1]], lst[[2]])
    }
    return (ret)
}

Однако я сомневаюсь, что это еще не реализовано в R, хотя я до сих пор не нашел его.В противном случае есть более эффективный способ сделать это?

Я не могу использовать do.call(), поскольку бинарные операторы принимают только два аргумента, и я хотел бы применить бинарный оператор к большему количеству аргументов.

Ответы [ 2 ]

8 голосов
/ 14 февраля 2012

В данном случае, в частности, это будет делать то же самое:

> apply(foo, 1, function(x) Reduce("|", x))
[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

Я не уверен, будет ли это обобщать какую-либо реальную проблему, которую вы имеете в виду, но похоже, что-то, связанное сReduce это то, что ты имеешь в виду, нет?

5 голосов
/ 14 февраля 2012

Вы можете попробовать другой подход. Для выполнения операций по столбцам вы можете посмотреть на apply(yourDF, 2, theFunction). Чтобы применить операцию | ко всему вектору, theFunction может быть any, например, apply(foo, 2, any).

Однако, учитывая ваш пример, я думаю, что вы можете ссылаться на построчные операции, и в этом случае команда будет apply(foo, 1, any).

Чтобы получить эквивалент по вектору &, вы можете использовать all вместо any.

Приятным аспектом этих двух является то, что они, как сообщается, останавливаются, как только определяется результат, например, после первого TRUE для any и первого FALSE для all.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...