2017-07-10 11 views
3

データフレームの各行の元の文字列の長さに基づいて、可変要素の部分文字列をサンプリングするR関数を記述しようとしています。私は最初に、それぞれの描画を繰り返す回数を計算し、これを関数に追加して、各行に対して取られたサンプルの数がその行のnum_draws列に基づいているようにしたいと思います。私の考えは、一般化されたインスタンスを使用して、各行で動作するために関数の外でapplyステートメントを使用することでしたが、col 3を汎用インスタンスとして呼び出す関数を設定する方法を理解することはできません。最初の行の値、またはすべての行の値)。与えられた文字列長の部分文字列の可変数をサンプルする関数

例えばデータフレーム:

BP        TF         num_draws 
1 CGGCGCATGTTCGGTAATGA   TFTTTFTTTFFTTFTTTTTF    6 
2 ATAAGATGCCCAGAGCCTTTTCATGTACTA TFTFTFTFFFFFFTTFTTTTFTTTTFFTTT  9 
3 TCTTAGGAAGGATTC    FTTTTTTTTTFFFFF      4 

所望の出力:

[1]GGCGC FTTTF 
    AATGA TTTTF 
    TTFFT TGTTC 
    TAATG TTTTT 
    AATGA TTTTF 
    CGGCG TFTTT 

[2]AGATG FTFTF 
    ATAAG TFTFT 
    ATGCC FTFFF 
    GCCCA FFFFF 
    ATAAG TFTFT 
    GTACT TFFTT 
    GCCCA FFFFF 
    TGCCC TFFFF 
    AGATG FTFTF 

[3]TTAGG TTTTT 
    CTTAG TTTTT 
    GGAAG TTTTT 
    GGATT TTFFF 

例コード:

#make example data frame 
BaseP1 <- paste(sample(size = 20, x = c("A","C","T","G"), replace = TRUE), collapse = "") 
BaseP2 <- paste(sample(size = 30, x = c("A","C","T","G"), replace = TRUE), collapse = "") 
BaseP3 <- paste(sample(size = 15, x = c("A","C","T","G"), replace = TRUE), collapse = "") 
TrueFalse1 <- paste(sample(size = 20, x = c("T","F"), replace = TRUE), collapse = "") 
TrueFalse2 <- paste(sample(size = 30, x = c("T","F"), replace = TRUE), collapse = "") 
TrueFalse3 <- paste(sample(size = 15, x = c("T","F"), replace = TRUE), collapse = "") 
my_df <- data.frame(c(BaseP1,BaseP2,BaseP3), c(TrueFalse1, TrueFalse2, TrueFalse3)) 


#calculate number of draws by length 
frag_length<- 5 
my_df<- cbind(my_df, (round((nchar(my_df[,1])/frag_length) * 1.5, digits = 0))) 
colnames(my_df) <- c("BP", "TF", "num_draws") 

#function to sample x number of draws per row (this does not work) 
Fragment = function(string) { 
    nStart = sample(1:(nchar(string) -5), 1) 
    samp<- substr(string, nStart, nStart + 4) 
replicate(n= string[,3], expr = samp) 
    } 


apply(my_df[,1:2], c(1,2), Fragment) 

答えて

2

1つのオプションは、別の引数nを持って作成する機能を変更することであろう内のnStart 0コール

Fragment = function(string, n) { 
    replicate(n= n, {nStart <- sample(1:(nchar(string) -5), 1) 
        samp <- substr(string, nStart, nStart + 4) 
       }) 

} 

apply(my_df, 1, function(x) data.frame(lapply(x[1:2], Fragment, n = x[3]))) 
$`1` 
#  BP TF 
#1 GGCGC FFTTF 
#2 GGTAA TFFTT 
#3 GCGCA TTFTT 
#4 CGCAT TFFTT 
#5 GGCGC FTTTF 
#6 TGTTC FTTFT 

#$`2` 
#  BP TF 
#1 GTACT TTTTF 
#2 ATAAG FTTFT 
#3 GTACT TFTFF 
#4 TAAGA TTTTF 
#5 CCTTT FFTTF 
#6 TCATG TTTTF 
#7 CCAGA TFTFT 
#8 TTCAT TFTFT 
#9 CCCAG FTFTF 

#$`3` 
#  BP TF 
#1 AAGGA TTTFF 
#2 AGGAT TTTTT 
#3 CTTAG TFFFF 
#4 TAGGA TTTFF 
+1

ありがとうございます@akrun! – user8173816

関連する問題