Я хочу использовать 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.)