Как сделать так, чтобы результаты списка подсчитанных значений стали горячими, как функции фрейма данных

#r #function #dataframe

#r #функция #фрейм данных

Вопрос:

У меня есть следующий фрейм данных:

 v1        v2       v3
          S10      tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt
         AMPC      tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa
         AROH      gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg
  

Я выполняю преобразование в v3 , чтобы разделить строки на каждые 2 буквы и получить количество совпадений каждой пары букв следующим образом:

 lapply(df$v3, function(x) oligonucleotideFrequency(DNAString(x), width = 2))
  

это результат этого преобразования для первой строки в версии v3:

 AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4 
  

Теперь у меня есть все значения для каждой пары букв в строках версии v3, но каждое значение разделено и не предоставляет глобальное значение. Теперь то, что я хотел бы сделать, это сделать так, чтобы каждая пара букв стала функцией фрейма данных, где значением каждой функции было бы количество вхождений каждой пары в одну и ту же строку.

это было бы что-то вроде этого:

 v1        v2     AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
          S10     3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4                        
         AMPC     3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3 
         AROH     2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9
  

Как я могу достичь этого результата?

Заранее спасибо

Ответ №1:

Решение, использующее базу R.

 library(Biostrings)

dat <- read.table(text = "v1        v2       v3
' '         'S10'      'tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt'
' '        'AMPC'      'tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa'
' '        'AROH'      'gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg'",
stringsAsFactors = FALSE, header = TRUE)

# Count the nucleotide number  
lst1 <- lapply(dat$v3, function(x) oligonucleotideFrequency(DNAString(x), width = 2))
# Transpose the vector and convert to a data frame for each element
lst2 <-  lapply(lst1, function(x) as.data.frame(t(x)))
# Comebine all single data frame into one data frame row-wise
dat2 <- do.call(rbind, lst2)
# Comebine with the original data frame column-wise
dat3 <- cbind(dat, dat2)
# Remvoe the v3 column
dat3$v3 <- NULL
dat3
#   v1   v2 AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT
# 1     S10  3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4
# 2    AMPC  3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3
# 3    AROH  2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9
  

Комментарии:

1. черт возьми, www, это потрясающе!! Я у тебя в долгу, еще раз спасибо!! Не могли бы вы просто немного объяснить, что делает часть кода, содержащая список?? ради обучения, пожалуйста

2. @Miguel2488 Я предоставил некоторые пояснения. Спасибо.