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

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

8
задан A5C1D2H2I1M1N2O1R2T1 14 December 2017 в 07:45
поделиться