2

文字列に接続する 2 つの列を持つデータ フレームがあります。1 つの列 ( という名前probes) にケースが重複しています (つまり、同じ文字列を持つ複数のケース)。プローブのケースごとに、同じ文字列を含むすべてのケースを検索し、2 番目の列 ( という名前genes) の対応するすべてのケースの値を 1 つのケースにマージしたいと考えています。たとえば、次の構造があるとします。

    probes  genes
1   cg00050873  TSPY4
2   cg00061679  DAZ1
3   cg00061679  DAZ4
4   cg00061679  DAZ4

この構造に変更したい:

    probes  genes
1   cg00050873  TSPY4
2   cg00061679  DAZ1 DAZ4 DAZ4

明らかに、 which を使用して単一のプローブに対してこれを実行しても問題はありません。次に、貼り付けて折りたたむ

ind<-which(olap$probes=="cg00061679")
genename<-(olap[ind,2])
genecomb<-paste(genename[1:length(genename)], collapse=" ")

しかし、データフレーム全体でプローブ列の重複のインデックスを抽出する方法がわかりません。何か案は?

前もって感謝します

4

2 に答える 2

4

tapplyベースRで使用できます

data.frame(probes=unique(olap$probes), 
           genes=tapply(olap$genes, olap$probes, paste, collapse=" "))

またはplyrを使用します。

library(plyr)
ddply(olap, "probes", summarize, genes = paste(genes, collapse=" "))

アップデート

これを行うのは、最初のバージョンの方がおそらく安全です。

tmp <- tapply(olap$genes, olap$probes, paste, collapse=" ")
data.frame(probes=names(tmp), genes=tmp)

一意の場合に備えて、プローブをとは異なる順序で指定しtapplyます。個人的にはいつも使っていますddply

于 2012-08-21T12:33:25.513 に答える
3

ベースRaggregate()はこれでうまくいくはずです:

aggregate(genes ~ probes, data = olap, as.vector)
#       probes            genes
# 1 cg00050873            TSPY4
# 2 cg00061679 DAZ1, DAZ4, DAZ4

as.vectorデータに対してさらに作業を行う必要がある場合に備えて、genes列を として保存しますが、文字列にしたい場合は試すlistこともできます。aggregate(genes ~ probes, data=test, paste, collapse=" ")

于 2012-08-21T13:09:00.140 に答える