我想找到基因汇总的最小值:
a <- data.frame(probe=c("probe1","probe2","probe3","probe4"), gene=c("gene1","gene1","gene2","gene1"), value=c(.001,.1,.05,.001))
# probe gene value
# 1 probe1 gene1 0.001
# 2 probe2 gene1 0.100
# 3 probe3 gene2 0.050
# 4 probe4 gene1 0.001
所以我这样做了:
aggregated <- aggregate(value~gene, data=a, FUN=min)
# gene value
# 1 gene1 0.001
# 2 gene2 0.050
b <- merge(aggregated, a)
# gene value probe
# 1 gene1 0.001 probe1
# 2 gene1 0.001 probe4
# 3 gene2 0.050 probe3
但是因为probe1和probe4具有相同的值,所以gene1是重复的,然后我需要选择两列中的一列(无论哪一列)。所以我可以这样做:
# THIS IS THE OUTPUT THAT I WANT
c <- aggregate(b, by=list(b$gene), function(x) x[1])[,-1]
# gene value probe
# 1 gene1 0.001 probe1
# 2 gene2 0.050 probe3
问题是我在循环中使用它,所以如果我将它应用于没有重复的数据帧,它将会出错:
aggregate(c, by=list(b$gene), function(x) x[1])[,-1]
# Error in aggregate.data.frame(c, by = list(b$gene), function(x) x[1]) : arguments must have same length
在应用第二个聚合体之前,我可以检查是否存在重复的探针 - 基因对,但我确信有更好的方法。
编辑:我的代码出错了。这实际上很完美
b <- merge(aggregate(value~gene, data=a, FUN=min), a);
aggregate(b, by=list(b$gene), function(x) x[1])[,-1]
但问题仍然存在,是否有更少的迂回方式来做到这一点?
答案 0 :(得分:1)
一个选项是使用package:data.table。这应该非常快:
library(data.table)
a <- data.table(a)
setkeyv(a, c("gene"))
a[, list(min(value), probe[which.min(value)]), by = gene]