2017-07-10 3 views
3

Ich versuche, eine R-Funktion zu schreiben, die eine variable Anzahl von 5-Element Teilstrings, basierend auf der Länge der ursprünglichen Zeichenfolge in jeder Zeile eines Datenrahmens abzutasten. Ich habe zuerst berechnet, wie oft jede Zeichnung wiederholt werden soll, und möchte dies in die Funktion einfügen, so dass die Anzahl der für jede Zeile genommenen Stichproben auf der Spalte "num_draws" für diese Zeile basiert. Mein Gedanke war, eine verallgemeinerte Instanz zu verwenden und dann eine apply-Anweisung außerhalb der Funktion zu verwenden, um auf jede Zeile zu reagieren, aber ich kann nicht herausfinden, wie die Funktion zum Aufrufen von Spalte 3 als verallgemeinerte Instanz eingerichtet wird der Wert nur der ersten Zeile oder der Wert aller Zeilen).Funktion zum Abtasten variabler Anzahl von Teilstrings gegeben Stringlänge

Beispiel Datenrahmen:

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

gewünschter Ausgang:

[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 

Beispielcode:

#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) 

Antwort

2

Eine Möglichkeit, ein weiteres Argument zu haben n wäre, um die Funktion zu ändern und erstellen die nStart innerhalb der replicate Anruf

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

Danke @akrun! – user8173816

Verwandte Themen