2011-01-29 73 views
8

我想使用R将带有非唯一rownames的表中的数值数据汇总到具有唯一行名的结果表中,并使用自定义函数汇总值。汇总逻辑是:如果最大值与最小值的比值为< 1.5,则使用值的均值,否则使用中值。由于表格非常大,我正尝试使用reshape2包中的melt()和cast()函数。R中的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一个。)

回答

2

dcast()试图设置默认值缺失组合的价值。

您可以通过填充参数指定这个,但如果填充= NULL, 然后通过有趣(0-lenght矢量)返回的值(即汇总(数字(0))在这里)作为默认值。 ?

请参阅dcast

那么,这里是一个解决办法:

dcast(tab.melt, gene~variable, summarize, fill=NaN) 
+0

感谢您关注此问题并提供帮助。 – user594694 2011-01-30 08:14:19

9

简短的回答:为填充值如下 acast(tab.melt,基因〜变量,总结,填写= 0)

长答案: 看来你的函数被包装如下,在传递给vagappregate函数之前vApply(dcast调用cast的调用混合调用vApply):

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

要找出.DEFAULT应该是什么,此代码被执行

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

即.value的被传递给函数[0]。当x是数字(0)时,min(x)或max(x)返回Inf或-Inf。但是,max(x)/ min(x)返回具有类逻辑的NaN。所以,当vapply执行

vapply(indices, fun, .default) 

与默认值为是类逻辑(用来作为vapply模板),功能开始返回双打时失败。

+0

很好的解释! – hadley 2011-01-29 14:25:14