2016-07-14 4 views
1

こんにちは私は複雑な問題を抱えています。どのようにデータフレーム2のデータフレーム2の情報を抽出するためにデータフレーム1の各行の特定の位置を見つける

私は2つのデータフレームを持ち、df1の1つの列を条件付きでdf2と一致させたいと考えています。

Df1: 
gene int start_pos end_pos tag 
A 1 233  422  a1 
A 2 622  766  a2 
A 3 1021  1211  ab 
A 4 1400  1500  b1 
A 4 2000  2200  b2 
B 1 122  233  a1 
B 2 332  665  a2 
C 1 199  433  a1 
C 2 776  899  a2 

df2: 
Gene type pos 
A  shrt 680 
A  long 1420 
B  shrt 350 
C  long 790 

「pos」情報に基づいて、これらの2つのテーブルを一致させたいと思います。

私はしたい:df2の各遺伝子についてpos(position)をチェックし、df1でその位置を見つける。たとえばdf 2 A-680の最初の行の例では、df1に遺伝子Aを見つけてから、位置680を検索し、この位置に対応する「タグ」を探したいとします。

だから最後に、私はこのように、DF1からタグ情報に基づいて、DF2に列を追加したい:

df2: 
Gene type pos tag 
A  shrt 680 a2 
A  long 1420 b1 
B  shrt 350 a2 
C  long 790 a2 

は、私がこれを行うには、任意の解決策を見つけることができませんでした。私はユニークな識別子を作ることができないので、マージは機能しません。私は一致機能を持つ解決策も見つけられませんでした。

注:df1は基本的に参考データです。 df2のすべての位置はdf1の開始と停止の間にあります。私はdf1の各位置のタグ情報を探したい。

私は立ち往生しています。どんな助けも素晴らしいだろう。

ありがとうございました!

答えて

2

あなたが参加するという問題は、列名が同じではないことです(遺伝子対遺伝子)。ここで

は、あなたが探しているコードです:

library(dplyr) 
Df1 <- data.frame(gene = c("A", "A","A","A","A","B","B","C","C") , 
       int = c(1,2,3,4,4,1,2,1,2), 
       start_pos = c(233,622,1021,1400,2000,122,332,199,776), 
       end_pos = c(422,766,1211,1500,2200,233,665,433,899), 
       tag = c("a1", "a2","ab","b1","b2" , "a1","a2","a1","a2")) 


df2 <- data.frame(Gene = c("A","A","B","C"), 
       type = c("shrt", "long", "shrt", "long"), 
       pos = c(680,1420,350,790)) 


colnames(Df1)[1] <- "Gene"  ## matching the column name 

Merge_data <- inner_join(df2,Df1) 
filter_data <- filter(Merge_data, pos > start_pos & pos < end_pos) 

Result <- select(filter_data, c(Gene,type,pos,tag)) 

Gene type pos tag 
1 A shrt 680 a2 
2 A long 1420 b1 
3 B shrt 350 a2 
4 C long 790 a2 
+0

ありがとうございます!これは私の問題を解決しました。私はこのソリューションを 'dataframe'の代わりに2つの 'list'で使用しました。これは(df1とdf2の2つのcsvファイルをインポートするためにリストされたものです) – AGG

+0

列の名前を変更する代わりに、by.xとby.yを使用して、Rにこれらの2つの列を使用して一致させることができます – Kou

0

を次のように結果がこれを行うためのもう一つくらいsloppierの方法は、ベースdata.framesのlist()を作成することです各遺伝子位置の範囲(変数df2$pos、ここではおそらく)。

これはfor loopで行われ、まずdf2に新しい変数を設定し、list1list2という名前の2つの作業リストを作成which()

使用してデータをサブセット化することができます。

df2$tag <- NA 
list1 <- list() 
list2 <- list() 

今のためにfor loop

for (i in 1:nrow(df2)){ 
    # Use list1 to create a subset matching the genes 
    list1[[i]] <- na.omit(df1[which(df2$Gene[i] == df1$gene),]) 
    # Use list2 to create a subset where df2$pos is greater than or equal to df1$start_pos 
    list2[[i]] <- na.omit(list1[[i]][which(df2$pos[i] >= list1[[i]]$start_pos),]) 
    # Finally assign the 'tag' for df2$pos is less than o equal to df1$end_pos 
    df2$tag[i] <- as.character(list2[[i]][which(df2$pos[i] <= list2[[i]]$end_pos),"tag"]) 
} 

そして、私たちには:

Gene type pos tag 
1 A shrt 680 a2 
2 A long 1420 b1 
3 B shrt 350 a2 
4 C long 790 a2 

別のオプションを指定してください。

関連する問題