2016-08-05 10 views
2

私は出力データを持っていますが、各行には遺伝子ごとに複数のアイソフォームがあります。アイソフォームはコンマで区切られています '、'。テーブルをRにインポートすると、データフレームは以下のようになります。R:コンマで区切られたデータフレームオブジェクト(df [1,1]など)の値をどのように区切るか?

Df: 
gene isoform    sample1_read_number  p-value 
A 'A1','A2','A3'   0:23,1:12,2:122   0.9,0.01,0.5 
B 'B1','B2','B3'   0:3,1:45,2:76    0.43,0.001,0.12 
C 'C1','C2','C3','C4' 0:5,1:56,2:166,3:7   0.004,0.002,0.23,0.12 
D 'D1','D2'    0:43,1:100     0.1,0.0003 

各遺伝子について、複数のアイソフォームが存在する。それぞれのアイソフォームについて、カンマ(0:23はA1の読み値が23であることを読み取る)とp値をコンマで区切って読み込みます(A1のp値は0.9、A2は0.01です)。ですから、すべてのオブジェクトのコンマ区切りですべてが順番に並んでいます。例えば

Iが呼ぶ、df[1,2]結果は[1] 'A1','A2','A3''
又はdf[1,4]結果が1つのオブジェクトとして[1] 0.9,0.01,0.5です。私はdf [X、Y]の中でこれらの値を分離するためのRの作り方を理解できませんでした。

私がこれをやりたい理由は、このデータをp値または読み取り番号に基づいてフィルタリングしたいからです。それを可能にするには、最初に、各アイソフォームによってこのデータフレームを破ることができ、それを行うために、各スポットで値を区切る方法を見つける必要があります。

最終データフレームは、(ここでしか遺伝子AとBのために示す)そのようにする必要があります:

Df_I: 
gene isoform sample1_read_number p-value 
A A1  0:23     0.9 
A A2  1:12     0.01 
A A3  2:122    0.5 
B B1  0:3     0.43 
B B2  1:45     0.001 
B B3  2:76     0.12 

誰もがこの第二のデータフレームを作るために私のアイデアを与えることができますか? 何か助けていただければ幸いです!

乾杯!

+0

からcSplitで行うことができます。 http://stackoverflow.com/q/5963269/4552295 – snoram

+0

あなたのデータは、データベースコンセプトの「正規化」ロジックに違反しています。最初に、意味のある各データを別々のセルに入力する必要があります。おそらく、sample1_read_numberおよびp-valueカラムの場合と同様に、isoformカラムのカラムをさらに定義する必要があります。古典的な正規化ルールに従っていれば、状態1から状態2への変換は簡単になります。 –

+1

投稿したソリューションを試しましたか? – akrun

答えて

3

separate_rows機能は、あなたのケースのために書かれたtidyrパッケージからあります:

tidyr::separate_rows(df, isoform:p.value, sep = ",") 

# gene isoform sample1_read_number p.value 
#1  A  A1    0:23  0.9 
#2  A  A2    1:12 0.01 
#3  A  A3    2:122  0.5 
#4  B  B1     0:3 0.43 
#5  B  B2    1:45 0.001 
#6  B  B3    2:76 0.12 
#7  C  C1     0:5 0.004 
#8  C  C2    1:56 0.002 
#9  C  C3    2:166 0.23 
#10 C  C4     3:7 0.12 
#11 D  D1    0:43  0.1 
#12 D  D2    1:100 0.0003 
+0

すべての列の要素数と指定した対応が同じであれば、必要な数の列に使用できます。たとえば、表示しているデータには3つの列があります。 – Psidom

+0

非常に便利な機能!ありがとうございました。しかし、私はそれを使用すると 'isoforms'と' p.value'だけを分離し、 'sample1_read_number'では動作しません。 Sample1_read_numberは、遺伝子Aの各行について、この「0:23,1:12、2:122」のように見えます。 – AGG

+0

コードをコピー&ペーストしましたか? 'isoform'と' p.value'の間に ':'があり、 'isoform'から始まり' p.value'で終わる列の範囲を示しています。 – Psidom

1

これは、簡単に例のデータを入力してくださいsplitstackshape

library(splitstackshape) 
na.omit(cSplit(Df, 2:ncol(Df), ",", "long")) 
# gene isoform sample1_read_number p.value 
# 1: A  A1    0:23 0.9000 
# 2: A  A2    1:12 0.0100 
# 3: A  A3    2:122 0.5000 
# 4: B  B1     0:3 0.4300 
# 5: B  B2    1:45 0.0010 
# 6: B  B3    2:76 0.1200 
# 7: C  C1     0:5 0.0040 
# 8: C  C2    1:56 0.0020 
# 9: C  C3    2:166 0.2300 
#10: C  C4     3:7 0.1200 
#11: D  D1    0:43 0.1000 
#12: D  D2    1:100 0.0003 
+1

実際、これは私の問題をさらに改善しました!この機能を教えてくれてありがとう! – AGG

+0

sample1_read_numberカラムに '0:'の部分を取り除く方法があるかどうか知っていますか?私は読まれた数に基づいてフィルタを入れたいが、アイソフォーム識別子(0:、1:、2:、4 :)があるので、それらを数字として扱うことはできない。 – AGG

+0

私は実際には、このソリューションがうまくいかなかったことを認識しています。それは私に各遺伝子の最初のアイソフォームしか与えません。 – AGG

関連する問題