Условная частота ДНК в R

Я пытаюсь найти, есть ли какая-либо условная зависимость в двух разных последовательностях ДНК в R

Это мой код, но я получаю сообщение об ошибке;

Error in `[.data.frame`(data, i) : undefined columns selected

Я не уверен, в чем проблема, если я заключу в скобки data[i-1]==bases[b2], я просто получу несколько unexpected}, и это единственное, что я могу придумать, чтобы сделать.

for (b1 in 1:length(bases))
{
   for (b2 in 1:length(bases))
   {
       count = 1
       for (i in 2:length(mydata1))
       {
           if ((mydata1[i]==bases[b1]) & mydata1[i-1]==bases[b2])
           {
               count = count+1
           }
       }
       b3 = c(bases[b1], bases[b2], count)
       print(b3)
   }
}

_Я ожидаю, по сути, списка определенных оснований ДНК, например, я вижу это так, как если бы последовательность ДНК была обусловлена ​​предыдущим основанием ;.

[1] "A" "C" "002"
[1] "A" "C" "005"
[1] "A" "C" "009"

и т. д., которые могут показать мне какое-либо указание на то, оказывает ли определенная база какое-либо влияние на идентичность следующей базы, четко показывая условие того, что A предшествует C.

Итак, по сути, mydata1 (есть также mydata2) - это последовательности ДНК, то есть список из "A", "G", "C" and "T", каждая из которых имеет длину 10 000 оснований.

Как показано здесь;

  V1
1  T
2  C
3  G
4  G
5  T
6  G
7  G 
8  G
9  C
10 A

Мне поручено определить, есть ли в последовательности базы, которые зависят друг от друга, поэтому, если [1] T влияет на присутствие [2] C и т. д. Одна из последовательностей является зависимой, а другая - нет.


person daenwaels    schedule 27.11.2017    source источник
comment
Людям будет намного проще помочь, если вы предоставите воспроизводимый минимальный пример включая ожидаемый результат и образцы данных.   -  person Maurits Evers    schedule 28.11.2017
comment
Можете ли вы добавить базовые сведения о структуре ваших данных? Вы используете length(mydata1), но никогда больше не обращаетесь к этим данным, а используете структуру данных data в теле цикла for. Трудно сказать, что вызывает проблемы.   -  person PhillipD    schedule 28.11.2017
comment
mydata и data - разные имена переменных. Учитывая логику вашего кода, они почти наверняка должны быть одинаковыми.   -  person Konrad Rudolph    schedule 28.11.2017
comment
Извините, я новичок во всем этом. Я обновил свой первоначальный пост с исправлениями. Не совсем уверен, что это поможет больше, плохо, если это не так.   -  person daenwaels    schedule 28.11.2017
comment
Попытайтесь показать нам head() всех данных, которые вы используете - это не обязательно должны быть реальные данные, но они должны иметь одинаковый тип значений (т.е. символьные / числовые / и т. Д.), Я думаю, что то, что вы делаете, можно обойтись без всех этих циклов for, но понятия не имею, с чем мы работаем здесь.   -  person Edward Tyler    schedule 28.11.2017
comment
Я добавил первые 10 строк своих данных, если это поможет вам понять, как я к этому подхожу.   -  person daenwaels    schedule 28.11.2017
comment
Что значит "A" "A" "058"? A, за которым следует A, 58 раз?   -  person zx8754    schedule 28.11.2017
comment
@ zx8754, который говорит в позиции 058, A следует за A. И спасибо за подсказку, я не знал!   -  person daenwaels    schedule 28.11.2017
comment
Извините, может быть, неясно, если бы ваши данные были 10 строк, каков был бы ожидаемый результат?   -  person zx8754    schedule 28.11.2017
comment
@ zx8754 Прошу прощения за это, я думаю, что, возможно, я смотрю на это в совершенно неправильном свете. Я обновил этот раздел в посте, как я думаю. Если это то, о чем вы пытаетесь просить?   -  person daenwaels    schedule 28.11.2017
comment
Если data или mydata - это dataframe, mydata[i] возвращает i-й столбец, а не i-ю строку. Если вы хотите вернуть i-ю строку всех столбцов, вам понадобится mydata[i,]. Если вы хотите вернуть i-ю строку j-го столбца, вы делаете mydata[i,j].   -  person Lamia    schedule 28.11.2017


Ответы (1)


Если я правильно понимаю, вы хотите посчитать вхождения каждой пары нуклеотидов i, i + 1 в последовательности ДНК. Вы можете добиться этого с помощью таблицы функций R; пример приведен ниже.

# input sequence
seq <- "ACGTACTGCACAAACTAC"

# length of input sequence
length_seq <- nchar(seq, type="chars")

# first substring: from 1 to second-last 
seq1 <- substr(seq, 1, (length_seq - 1))

# second substring: from 2 to last
seq2 <- substring(seq, 2, length_seq)

# split strings
seq1_split <- strsplit(seq1, "")[[1]]
seq2_split <- strsplit(seq2, "")[[1]]

# initialize vectors
first_nt <- vector(mode="character", length = (length_seq - 1))
second_nt <- vector(mode="character", length = (length_seq -1))

# fill vectors
count = 0
for (b in seq1_split)
{
    count = count + 1
    first_nt[count] <- b
}

count = 0
for (b in seq2_split)
{
    count = count + 1
    second_nt[count] <- b
}

# create matrix with character i and i+1 in each row
mat <- matrix(c(first_nt, second_nt), nrow=(length_seq - 1))

# collapse matrix
to_table <- apply(mat, 1, paste, collapse="")

# table
my_table <- table(to_table)

print(my_table)
person Alessandro Testori    schedule 28.11.2017