2015-10-14 12 views
8

私はこのデータフレームを持っていますmydfnucleotideの列には、 'A'、 'T'、 'G'、 'C​​'の各文字を使用できます。 strandの列が ' - 'の場合、文字AをT、CをG、GをC、TをAに変更したいとします。どうすればいいのですか?Rの列一致パターンの値を変換する方法

mydf<- structure(list(seqnames = structure(c(1L, 1L, 1L, 1L), .Label = c("chr1", 
    "chr2", "chr3", "chr4", "chr5", "chr6", "chr7", "chr8", "chr9", 
    "chr10", "chr11", "chr12", "chr13", "chr14", "chr15", "chr16", 
    "chr17", "chr18", "chr19", "chr20", "chr21", "chr22", "chrX", 
    "chrY", "chrM"), class = "factor"), pos = c(115258748, 115258748, 
    115258748, 115258748), strand = structure(c(1L, 2L, 1L, 2L), .Label = c("+", 
    "-", "*"), class = "factor"), nucleotide = structure(c(2L, 2L, 
    2L, 2L), .Label = c("A", "C", "G", "T", "N", "=", "-"), class = "factor")), .Names = c("seqnames", 
    "pos", "strand", "nucleotide"), row.names = c(NA, 4L), class = "data.frame") 

結果

seqnames  pos strand nucleotide 
1  chr1 115258748  +   C 
2  chr1 115258748  -   G 
3  chr1 115258748  +   C 
4  chr1 115258748  -   G 

答えて

16

一対一の文字変換のために、あなたはchartr()を使用することができます。私はmydf$ 4回の書き込みを避けるために、元のデータを変更することから救うためにここwithin()を使用

within(mydf, { 
    nucleotide[strand == "-"] <- chartr("ACGT", "TGCA", nucleotide[strand == "-"]) 
}) 
# seqnames  pos strand nucleotide 
# 1  chr1 115258748  +   C 
# 2  chr1 115258748  -   G 
# 3  chr1 115258748  +   C 
# 4  chr1 115258748  -   G 

注意。次のように書くこともできますが、元のデータを変更することに注意してください。

mydf$nucleotide[mydf$strand == "-"] <- 
    with(mydf, chartr("ACGT", "TGCA", nucleotide[strand == "-"])) 
+3

'chartr'は、このシナリオのために理想的ですが、古いものと新しい値のルックアップテーブルを作成することはそうでない場合は、おそらく最も効率的な方法である - http://stackoverflow.com/questions/18456968/how-do-i (mydf、ifelse(strand == " - "、 - ) - マップ内の値を別のベクトルにマップする - 18457055#18457055また、 chartr( "ACGT"、 "TGCA"、ヌクレオチド)、ヌクレオチド)) ')は、変数の上書きを避けます。 – thelatemail

関連する問題