R での特定のコーディングの問題に対する効率の提案をお願いしたいと思います。次のスタイルの文字列ベクトルがあります。
[1] "HGVSc=ENST00000495576.1:n.820-1G>A;INTRON=1/1;CANONICAL=YES"
[2] "DISTANCE=2179"
[3] "HGVSc=ENST00000466430.1:n.911C>T;EXON=4/4;CANONICAL=YES"
[4] "DISTANCE=27;CANONICAL=YES;common"
ベクトルの各要素では、単一のエントリは で区切られており、ほとんど;
の単一のエントリの形式は ですKEY=VALUE
。ただし、フォーマットしか持たないエントリもいくつかありますKEY
([4] の「共通」を参照)。この例では、15 の異なるキーがあり、すべてのキーがベクトルの各要素に表示されるわけではありません。15 の異なるキーは次のとおりです。
names <- c('ENSP','HGVS','DOMAINS','EXON','INTRON', 'HGVSp', 'HGVSc','CANONICAL','GMAF','DISTANCE', 'HGNC', 'CCDS', 'SIFT', 'PolyPhen', 'common')
このベクトルから、次のようなデータフレームを作成したいと思います。
ENSP HGVS DOMAINS EXON INTRON HGVSp HGVSc CANONICAL
1 - - - - 1/1 - ENST00000495576.1:n.820-1G>A YES
2 - - - - - - - -
3 - - - 4/4 - - ENST00000466430.1:n.911C>T YES
4 - - - - - - - YES
GMAF DISTANCE HGNC CCDS SIFT PolyPhen common
1 - - - - - - -
2 - 2179 - - - - -
3 - - - - - - -
4 - 27 - - - - YES
問題を解決するためにこの関数を書きました:
unlist.info <- function(names, column){
info.mat <- matrix(rep('-', length(column)*length(names)), nrow=length(column), ncol=length(names), dimnames=list(c(), names))
info.mat <- as.data.frame(info.mat, stringsAsFactors=F)
for (i in 1:length(column)){
info <- unlist(strsplit(column[i], "\\;"))
for (e in info){
e <- unlist(strsplit(e, "\\="))
j <- which(names == e[1])
if (length(e) > 1){
# KEY=VALUE. The value might contain a = as well
value <- paste(e[2:length(e)], collapse='=')
info.mat[i,j] <- value
}else{
# only KEY
info.mat[i,j] <- 'YES'
}
}
}
return(info.mat)
}
そして、私は電話します:
mat <- unlist.info(names, vector)
これは機能しますが、本当に遅いです。また、100.000 を超えるエントリを持つベクトルを処理しています。今では、R ではループが洗練されておらず非効率的であることに気付き、関数をデータ フレームに適用するという概念に精通しています。ただし、ベクトルのすべてのエントリには、KEY=VALUE
またはKEY
エントリの異なるサブセットが含まれているため、より効率的な関数を思いつくことができませんでした。