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)
Danke @akrun! – user8173816