遺伝子ごとに集計された最小値を見つけたい:
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]
しかし、疑問は残ります。これを行うためのより回り道の少ない方法はありますか?