2016-07-19 8 views
1

コンテキスト:私は遺伝子とオントロジーで作業していますが、私の質問はRスクリプトの作成に関係しています。R、適用機能内で非リスト(およびその他の)関数を追加するにはどうすればよいですか?

データフレーム内のGO:IDを、データベースから抽出した対応する用語で置き換えたいとします。

これは私のソースデータフレームです。データベースへの要求が非常に簡単に見える

>gene_list_and_Go_ID 

     V1            V2 
2563 Gene1 GO:0003871, GO:0008270, GO:0008652, GO:0009086 
2580 Gene2 GO:0003871, GO:0008270, GO:0008652, GO:0009086 
12686 Gene3 GO:0003871, GO:0008270, GO:0008652, GO:0009086 
14523 Gene4    GO:0004489, GO:0006555, GO:0055114 

:ID(V2):これは、(V1)および関連GO遺伝子のリストである

>select(GO.db, my_Go_id, "TERM", "GOID") 

I手動でデータベースに対処するために、次の行を試みそれはうまくいった:

>my_Go_id = unlist(strsplit("GO:0008270, GO:0008652, GO:0009086", split=", ")) 
>select(GO.db, my_Go_id, "TERM", "GOID") 

    GOID          TERM 
1 GO:0008270       zinc ion binding 
2 GO:0008652 cellular amino acid biosynthetic process 
3 GO:0009086   methionine biosynthetic process 

私の問題:私はこのプロセスを自動化できません! 正確には、各行に対して、データベースに質問するために、データフレームの列n°2からベクトルに各文字列を変換する必要があります。 そして、データフレームのGO:IDを要求の結果で置き換える必要があります。起動するには

1 /は、私は私のデータフレームに "適用" 機能で "非公開に" 機能を入れてみました:

apply(gene_list_and_Go_ID,1,unlist(strsplit(gene_list_and_Go_ID[,2], split=", "))) 

私が得た:

Error in strsplit(ok, split = ", ") : non-character argument 

2 /続いて、適用機能内でデータベースにリクエストを追加することはできますか?

3 /最後に、データベース要求の結果によって列n°2を置き換える方法がわかりません。あなたの助けのための

  V1                V2 
2563 Gene1  GOID            TERM 
        1 GO:0008270       zinc ion binding 
        2 GO:0008652 cellular amino acid biosynthetic process 
        3 GO:0009086    methionine biosynthetic process 

ありがとう:

これは除外「理想的な」結果の一例です。

答えて

2

最近の問題は、applyに電話していないことです。関数を呼び出す代わりに、を呼び出す代わりに、配列の各行/列を最初の引数を介して入力として取得する関数を用意する必要があります。そのため、トン、しかし

apply(gene_list_and_Go_ID, 1, 
     function(x) { unlist(strsplit(x[2], split=", "))}) 

)あなたは全体行にgene_list_and_Go_IDを必要としないという通知を、これを必要とします。あなたがしたいのは、V2の列gene_list_and_Go_IDで作業することです。 strsplitベクトル化であることに注意してください。これは、1よりも大きなベクトルを渡すと、ベクトルの各要素に繰り返しstrsplit()を繰り返し呼び出すかのようにそのベクトルの各要素に作用します。

次のことを考えてみましょう:V2ニーズが文字ベクトルすべきこと

df <- data.frame(V1 = paste0("Gene", 1:4), 
       V2 = c("GO:0003871, GO:0008270, GO:0008652, GO:0009086", 
         "GO:0003871, GO:0008270, GO:0008652, GO:0009086", 
         "GO:0003871, GO:0008270, GO:0008652, GO:0009086", 
         "GO:0004489, GO:0006555, GO:0055114"), 
       stringsAsFactors = FALSE) 

注---ここで私は自動強制character停止するstringsAsFactors = FALSEを使用 - >factorを、しかし、あなたはまた、単にas.character(V2)どこを使用することができます以下のコードにV2があります。私たちが使用できるV2の各要素に対してstrsplitを実行するには

selectコールの表情でお

> spl 
[[1]] 
[1] "GO:0003871" "GO:0008270" "GO:0008652" "GO:0009086" 

[[2]] 
[1] "GO:0003871" "GO:0008270" "GO:0008652" "GO:0009086" 

[[3]] 
[1] "GO:0003871" "GO:0008270" "GO:0008652" "GO:0009086" 

[[4]] 
[1] "GO:0004489" "GO:0006555" "GO:0055114" 

を取得

spl <- with(df, strsplit(V2, ", ")) 

を、これはワンショット契約です - あなたが必要としますdf(お客様のgene_list_and_Go_ID)にすべての行を呼び出します。もしそうであれば、単にstrsplit()によって返されるリストの要素を反復:

names(spl) <- with(df, as.character(V1)) 
term <- lapply(spl, function(x, db) select(db, x, "TERM", "GOID"), 
       db = GO.db) 

これは、各要素がdfの単一遺伝子/行のselectへの呼び出しの結果であるリストを返します。あなたはおそらくしたい一緒に戻ってそれを置く

out <- cbind.data.frame(Gene = rep(names(spl), each = lengths(spl)), 
         do.call("rbind", term)) 

をしかし、私はによると、何select()はから来ているアイデアも何GO.db

+0

は、この非常に詳細な回答のために、あなたの時間をありがとう。多くのものは私のために全く新しいものです(paste0、with c、rbind、rep、lengths ...)。私はこれらの機能についてもっと知りたいと思っています。 :-) –

0

[OK]を作成していないように私は最後の数の部品をテストすることはできませんギャビンの答えと彼の親切な助け、私は正しいスクリプトを得た。しかし、私の "gene_list_and_Go_ID"データフレームの第2列を因子から文字に変換することは、私をブロックする非常に重要なステップでした。私は "strsplit"関数から "文字以外の引数"エラーをスキップするためにこれを行いました。この投稿は、私を助け:LINK

だからここに私の出発データフレームである:

>gene_list_and_Go_ID 

     V1            V2 
2563 Gene1 GO:0003871, GO:0008270, GO:0008652, GO:0009086 
2580 Gene2 GO:0003871, GO:0008270, GO:0008652, GO:0009086 
12686 Gene3 GO:0003871, GO:0008270, GO:0008652, GO:0009086 
14523 Gene4    GO:0004489, GO:0006555, GO:0055114 

次に、スクリプト。 最初の改行は(文字に要因から私のDFを変換する)非常に便利出演:

>gene_list_and_Go_ID <- data.frame(lapply(gene_list_and_Go_ID, as.character), stringsAsFactors=FALSE) 

次:

>V_ID <- with(gene_list_and_Go_ID, strsplit(V2, ", ")) 
>names(V_ID) <- with(gene_list_and_Go_ID, as.character(V1)) 
>terms <- lapply(V_ID, function(x, db) select(db, x, "TERM", "GOID"), db = GO.db) 

最終的な出力は完璧です:-):

> terms 
$Gene1 
     GOID      TERM 
1 GO:0003871 S-methyltransferase activity 
2 GO:0008270 zinc ion binding 
3 GO:0008652 cellular amino acid biosynthetic process 
4 GO:0009086 methionine biosynthetic process 

$Gene2 
... etc ... 
... etc ... 

注意、私は最後のギャビンの提案をスキップしました:

out <- cbind.data.frame(Gene = rep(names(spl), each = lengths(spl)), 
        do.call("rbind", term)) 

それは非常にエレガントなスクリプトかもしれないが、私はそれがないすべてのかを理解する難しさを持っており、ここではそれが生成するものである:

Error in data.frame(..., check.names = FALSE) : 
    arguments imply differing number of rows: 16, 15 
In addition: Warning message: 
In rep(names(V_ID), each = lengths(V_ID)) : 
    first element used of 'each' argument 

THX

関連する問題