Ошибка с пользовательской статистической функцией для вызова cast() в R reshape2

Я хочу использовать R для суммирования числовых данных в таблице с неуникальными именами строк в таблицу результатов с уникальными именами строк со значениями, суммированными с помощью пользовательской функции. Логика суммирования такова: используйте среднее значение, если отношение максимума к минимальному значению составляет < 1,5, иначе используйте медиану. Поскольку таблица очень большая, я пытаюсь использовать функции melt() и cast() в пакете reshape2.

# пример таблицы с неуникальными именами строк
tab <- data.frame (gene = rep (буквы [1: 3], каждый = 3), s1 = runif (9), s2 = runif (9))
# плавиться
tab.melt <- melt (tab, id = 1)
# функция для суммирования с помощью логики: среднее значение, если макс / мин < 1,5, иначе медиана
суммировать <- function (x) {ifelse (max (x) / min (x) < 1.5, среднее значение (x), медиана (x))}
# приведение с суммированными значениями
dcast (tab.melt, ген ~ переменная, сумма)

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

Ошибка в vapply(индексы, приколы, .default): 
  значения должны быть типа "логический",
 но результат FUN(X[[1]]) типа double
Дополнительно: Предупреждающие сообщения:
1: в max(x): нет не пропущенных аргументов для max; возвращение -Inf
2: в min(x): нет не пропущенных аргументов для min; возвращая инф

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

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

2 ответа

Краткий ответ: укажите значение для заполнения следующим образом: acast(tab.melt, gene~variable, sumisze, fill=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.

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

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

пожалуйста, видите?dcast

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

 dcast(tab.melt, gene~variable, summarize, fill=NaN)
Другие вопросы по тегам