2

遺伝子ごとに集計された最小値を見つけたい:

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

しかし、プローブ 1 とプローブ 4 の値が同じであるため、gene1 が重複しているため、2 つの列のいずれかを選択する必要があります (どちらの列でも構いません)。だから私はこれを行うことができます:

# 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

2 番目の集計を適用する前に、重複するプローブ遺伝子ペアの存在を確認できましたが、もっと良い方法があるはずです。

編集:私のコードに間違いがありました。これは実際には完全に機能します

b <- merge(aggregate(value~gene, data=a, FUN=min), a); 
aggregate(b, by=list(b$gene), function(x) x[1])[,-1]

しかし、疑問は残ります。これを行うためのより回り道の少ない方法はありますか?

4

1 に答える 1

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]
于 2012-07-03T20:35:25.103 に答える