1

私はこれをやろうとしていましたが、どこにも行きませんでした。どんな助けでも大歓迎です。

df1 <- data.frame(chrom = "chr1", start=c(10,20,30), end = c(100,200,300), stringsAsFactors=FALSE)
df2 <- data.frame(chrom = c("chr1", "chr2", "chr3"),start=c(15,500,150), end = c(75,1000,300), stringsAsFactors=FALSE)

df2のすべての行を取得したいのですがdf1$chrom == df2$chrom。またはさらに良いことに、新しいベクトルで出力を生成し、df1の後にdf2の行を表示するか、またはその逆を行いdf1$chrom == df2$chromます。

私は次のようにforループを使用してこれを試しました:

for(i in 1:nrow(df2)){
    x[i] <- df2[which(df1$chrom == df2$chrom[i])]
}

動作していません!

4

1 に答える 1

3

これは、あなたの望むことですか?

df2[df2$chrom == df1$chrom, ]
#   chrom start end
# 1  chr1    15  75

コメントに従って、次のことも試してみてください。

merge(df1, df2, by = 'chrom')

これにより、2 つのフレーム (「テーブル」) でデータベースの「結合」が行われます。その結果がこれです。

  chrom start.x end.x start.y end.y
1  chr1      10   100      15    75
2  chr1      20   200      15    75
3  chr1      30   300      15    75

R を取り入れるのは必ずしも効率的な方法ではありませんが、便利です。パラメータを使用して「.x」を制御できます (ヘルプ ページを参照してください: ?merge)。df2 のすべてのフィールドを含める場合は、「all = TRUE」パラメーター設定を追加してマージできます。

前に触れたように、全体的なアプローチを検討するのが最善です。結果のフレームに多くの冗長性を入力したため、これは必ずしもデータを処理する効率的な方法ではありません。代わりに、データベース用語では、df2 を「ルックアップ」テーブルと考えています。df1 の「chr1」は、df1 に関連付けられているが、それとは異なる df2 (外部キー) の情報を参照します。上記のマージが示すように、df2 の情報を繰り返す代わりに、必要なときに簡単にアクセスできます。これは、マージが便利になる場所です。

于 2012-04-09T20:16:19.537 に答える