0

注: バイオコンダクター固有の質問をしているわけではありませんが、サンプル コードではバイオコンダクターが必要です。我慢してください。

やあ、

特定の遺伝子に関するさまざまな種類の情報を含むタブ区切りのファイルが多数あります。1 つまたは複数の列が、最新の遺伝子シンボル アノテーションにアップグレードする必要がある遺伝子シンボルのエイリアスである可能性があります。

そのために Bioconductor の org.Hs.eg.db ライブラリを使用しています (特に org.Hs.egALIAS2EG および org.Hs.egSYMBOL オブジェクト)。

報告されたコードは機能しますが、反復ごとに org.Hs.eg.db データベースを照会する入れ子になった for ループが原因で、非常に遅いと思います。同じ結果を達成するためのより迅速/簡単/スマートな方法はありますか?

library(org.Hs.eg.db)

myTable <- read.table("tab_delimited_file.txt", header=TRUE, sep="\t", as.is=TRUE)

for (i in 1:nrow(myTable)) {
    for (j in 1:ncol(myTable)) {
        repl <- org.Hs.egALIAS2EG[[myTable[i,j]]][1]
        if (!is.null(repl)) {
            repl <- org.Hs.egSYMBOL[[repl]][1]
            if (!is.null(repl)) {
                myTable[i,j] <- repl
            }
        }
    }
}

write.table(myTable, file="new_tab_delimited_file", quote=FALSE, sep="\t", row.names=FALSE, col.names=TRUE)

適用関数のいずれかを使用しようと考えていますが、org.Hs.egALIAS2EG と org.Hs.egSYMBOL はオブジェクトであり、関数ではないことに注意してください。

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

4

4 に答える 4

2

機能を使用してくださいmget

eg[i,] <- mget( myTable[i,],  org.Hs.egALIAS2EG )
symbol[i, ] <- mget( myTable[i,], org.Hs.egSYMBOL )

など。これは、使用されることになっている方法であり、他の代替手段よりもはるかに高速です。ただし、最初に myTable を遺伝子名のベクトルに再形成する価値があるかもしれません。

v <- unique( as.vector( as.matrix( myTable ) ) )
v <- v[ v %in% ls( org.Hs.egALIAS2EG ) ]
eg <- unlist( mget( v, org.Hs.egALIAS2EG ) )
symbol <- unlist( mget( eg, org.Hs.egSYMBOL ) )

上記の 2 行目は、実際にデータベースにあるシンボルのみを検索していることを確認します。これで、シンボル テーブルを使用してテーブルを再度変更できます。myTable のすべての要素が一致するとは限らないと仮定して、これを行う方法を次に示します。t簡潔にするためにテーブルをコピーしています:

t <- as.matrix( myTable )
names( symbol ) <- v
t[ !is.na( match( t, v ) ) ] <- symbol[ match( t, v ) ][ ! is.na( match( t, v ) ) ]

わかった。これは、(多かれ少なかれ) 文字のマトリックスで作業していると仮定していました。ただし、率直に言って、2 つの列を持つデータ フレームしかないため、何百もの列があるかのようにコードを自動化する必要はありません。少し関数を書いてみましょう。(テーブル内のすべての要素が org.Hs.egALIAS2EG にあると仮定できれば、より簡単になります)

convert2symbol <- function( x ) {
  v <- unique( as.character( x ) )
  v <- v[ v %in% ls( org.Hs.egALIAS2EG ) ]
  eg <- unlist( mget( v, org.Hs.egALIAS2EG ) )
  symbol <- unlist( mget( eg, org.Hs.egSYMBOL ) )
  m <- match( x, v )
  v[ ! is.na( m ) ] <- symbol[ m ][ ! is.na( m ) ]
  v
}

今、あなたはすることができます

myTable$LigandGene <- convert2symbol( myTable$LigandGene )

また

newTable <- apply( myTable, 2, convert2symbol )

as.vector( data.frame ) が機能しない理由について: data.frame は行列ではありません。凝った方法で表示され、[]関数が定義されているリストです。

于 2013-07-11T14:16:02.063 に答える
1

簡単な警告: エイリアスは複数の Entrez Gene ID にマッピングされる可能性があります。

したがって、現在のソリューションは、最初にリストされた ID が正しいと想定しています (これは正しくない可能性があります)。

# e.g. The alias "A1B" is assumed to map to "1" and not "6641"
mget("A1B", org.Hs.egALIAS2EG)
# $A1B
# [1] "1"    "6641"

のヘルプを調べると?org.Hs.egALIAS2EG、エイリアスやシンボルを一次遺伝子識別子として使用することは決して推奨されていないことがわかります。

## From the 'Details' section of the help:
# Since gene symbols are sometimes redundantly assigned in the literature, 
# users are cautioned that this map may produce multiple matching results 
# for a single gene symbol. Users should map back from the entrez gene IDs 
# produced to determine which result is the one they want when this happens.

# Because of this problem with redundant assigment of gene symbols, 
# is it never advisable to use gene symbols as primary identifiers.

手動でキュレーションしないと、どの ID が「正しい」かを知ることは不可能です。したがって、最も安全な方法は、テーブル内の各エイリアスの可能な ID とシンボルをすべて取得し、どれが受容体でどれがリガンドであるかに関する情報を維持することです。

# your example subset with "A1B" and "trash" added for complexity
myTable <- data.frame(
    ReceptorGene = c("A1B", "ACVR2B", "ACVR2B", "ACVR2B", "ACVR2B", "AMHR2", "BLR1", "BMPR1A", "BMPR1A", "BMPR1A", "BMPR1A", "BMPR1A"),
    LigandGene = c("trash", "INHA", "INHBA", "INHBB", "INHBC", "AMH", "SCYB13", "BMP10", "BMP15", "BMP2", "BMP3", "BMP4"), 
    stringsAsFactors = FALSE
)

# unlist and rename
my.aliases <- unlist(myTable)
names(my.aliases) <- paste(names(my.aliases), my.aliases, sep = ".")

# determine which aliases have a corresponding Entrez Gene ID
has.key <- my.aliases %in% keys(org.Hs.egALIAS2EG)

# replace Aliases with character vectors of all possible entrez gene IDs 
my.aliases[has.key] <- sapply(my.aliases[has.key], function(x) {
    eg.ids <- unlist(mget(x, org.Hs.egALIAS2EG))
    symbols <- unlist(mget(eg.ids, org.Hs.egSYMBOL))
})

# my.aliases retains all pertinent information regarding the original alias
my.aliases[1:3]
# $ReceptorGene1.A1B
#       1    6641 
#  "A1BG" "SNTB1" 
# 
# $ReceptorGene2.ACVR2B
#       93 
# "ACVR2B" 
# 
# $ReceptorGene3.ACVR2B
#       93 
# "ACVR2B"

どの Entrez Gene ID が適切かがわかったら、それらを追加の列としてテーブルに保存できます。

myTable$receptor.id <- c("1", "93", "93", "93", "93", "269", "643", "657", "657", "657", "657", "657") 
myTable$ligand.id   <- c(NA, "3623", "3624", "3625", "3626", "268", "10563", "27302", "9210", "650", "651", "652")

次に、最新のシンボルに更新する必要がある場合は、Entrez Gene ID を使用するだけです (更新する必要はありません)。

has.key <- myTable$receptor.id %in% keys(org.Hs.egSYMBOL)
myTable$ReceptorGene[has.key] <- unlist(mget(myTable$receptor.id[has.key], org.Hs.egSYMBOL))

has.key <- myTable$ligand.id %in% keys(org.Hs.egSYMBOL)
myTable$LigandGene[has.key] <- unlist(mget(myTable$ligand.id[has.key], org.Hs.egSYMBOL))

head(myTable)
#   ReceptorGene LigandGene receptor.id ligand.id
# 1         A1BG      trash           1      <NA>
# 2       ACVR2B       INHA          93      3623
# 3       ACVR2B      INHBA          93      3624
# 4       ACVR2B      INHBB          93      3625
# 5       ACVR2B      INHBC          93      3626
# 6        AMHR2        AMH         269       268
于 2013-07-29T02:13:59.307 に答える
0

これは私が思いつくことができる最高のものです。

最初に関数を書きます:

alias2GS <- function(x) {
    for (i in 1:length(x)) {
        if (!is.na(x[i])) {
            repl <- org.Hs.egALIAS2EG[[x[i]]][1]
            if (!is.null(repl)) {
                repl <- org.Hs.egSYMBOL[[repl]][1]
                if (!is.null(repl)) {
                    x[i] <- repl
                }
            }
        }
    }
    return(x)
}

次に、次のように、変換が必要なデータ フレームの各列に対して関数を呼び出します。

df$GeneSymbols <- alias2GS(df$GeneSymbols)
于 2013-07-14T10:01:57.547 に答える