Ошибка с пользовательской статистической функцией для вызова cast () в R reshape2 - PullRequest
8 голосов
/ 29 января 2011

Я хочу использовать R для суммирования числовых данных в таблице с неуникальными именами строк в таблицу результатов с уникальными именами строк со значениями, суммированными с помощью пользовательской функции. Логика суммирования такова: используйте среднее значение, если отношение максимального к минимальному значению составляет <1,5, иначе используйте медиану. Поскольку таблица очень большая, я пытаюсь использовать функции melt () и cast () в пакете <a href="http://cran.r-project.org/web/packages/reshape2/index.html" rel="noreferrer"> reshape2 .

# example table with non-unique row-names
tab <- data.frame(gene=rep(letters[1:3], each=3), s1=runif(9), s2=runif(9))
# melt
tab.melt <- melt(tab, id=1)
# function to summarize with logic: mean if max/min < 1.5, else median
summarize <- function(x){ifelse(max(x)/min(x)<1.5, mean(x), median(x))}
# cast with summarized values
dcast(tab.melt, gene~variable, summarize)

Последняя строка кода выше приводит к уведомлению об ошибке.

Error in vapply(indices, fun, .default) : 
  values must be type 'logical',
 but FUN(X[[1]]) result is type 'double'
In addition: Warning messages:
1: In max(x) : no non-missing arguments to max; returning -Inf
2: In min(x) : no non-missing arguments to min; returning Inf

Что я делаю не так? Обратите внимание, что если функция суммирования должна была просто вернуть min () или max (), то ошибки нет, хотя есть предупреждающее сообщение о «нет не пропущенных аргументов». Спасибо за любое предложение.

(фактическая таблица, с которой я хочу работать, - это таблица 200x10000.)

Ответы [ 2 ]

9 голосов
/ 29 января 2011

Краткий ответ: укажите значение для заполнения следующим образом acast (tab.melt, ген ~ переменная, суммирование, заполнение = 0)

Длинный ответ: Похоже, что ваша функция упакована следующим образом, прежде чем она будет передана vapply в функцию vaggregate (вызовы dcast, которые вызывают vaggregate и вызов vapply):

fun <- function(i) {
    if (length(i) == 0) 
        return(.default)
    .fun(.value[i], ...)
}

Чтобы узнать, каким должен быть .default, выполняется этот код

if (is.null(.default)) {
    .default <- .fun(.value[0])
}

т.е. .value [0] передается в функцию. min (x) или max (x) возвращает Inf или -Inf, когда x является числовым (0). Однако max (x) / min (x) возвращает NaN, который имеет класс логический. Так, когда vapply выполняется

vapply(indices, fun, .default)

со значением по умолчанию логического класса (используется vapply в качестве шаблона), функция завершается ошибкой, когда начинает возвращать double.

2 голосов
/ 29 января 2011

dcast () пытается установить значение отсутствующей комбинации по умолчанию.

Вы можете указать это с помощью аргумента fill, но если fill = NULL, тогда значение, возвращаемое функцией fun (вектор 0-длины) (т.е. здесь суммирование (здесь числовое (0))) используется по умолчанию.

пожалуйста, смотрите? Dcast

тогда вот обходной путь:

 dcast(tab.melt, gene~variable, summarize, fill=NaN)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...