Понимание требований x аргумента в sub () - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть следующие фрагменты кода, где я хочу заменить числа (1,2,3,4) буквами (A, T, G, C) в векторе длины 20. Я намеренно хочу использовать для -loop, if-Statement и sub () , так как это является частью упражнения для демонстрации эффективности кода (in) по отношению к gsub () и which () .

rand1M = round(runif(n = 20,min = 1,max = 4))

it = 1
for(i in rand1M) {
  if(i == 1) {
    rand1M[it] = sub(pattern = "1", replacement = "A", x = i)
  }
  if(i == 2) {
    rand1M[it] = sub(pattern = "2", replacement = "T", x = i)
  }
  if(i == 3) {
    rand1M[it] = sub(pattern = "3", replacement = "G", x = i)
  }
  if(i == 4) {
    rand1M[it] = sub(pattern = "4", replacement = "C", x = i)
  }
  it = it + 1
}

Этот код выполняет все, что ему требуется, и в результате выполняются полные замены чисел в векторе.

После этого я попытался удалить операторы if, поскольку они кажутся немного излишними, учитывая, что sub () уже проверяет условие. И так:

rand1M = round(runif(n = 20,min = 1,max = 4))
it = 1
for(i in rand1M) {
    rand1M[it] = sub(pattern = "1", replacement = "A", x = i)
    rand1M[it] = sub(pattern = "2", replacement = "T", x = i)
    rand1M[it] = sub(pattern = "3", replacement = "G", x = i)
    rand1M[it] = sub(pattern = "4", replacement = "C", x = i)
  it = it + 1
}

В результате получается, что работает только самый последний sub () , поэтому в векторе заменяются только буквы C. Почему это происходит?

Замена "x = i" на "x = rand1M [it]", кажется, помогает, но я не могу понять, почему.

rand1M = round(runif(n = 20,min = 1,max = 4))
it = 1
for(i in rand1M) {
  rand1M[it] = sub(pattern = "1", replacement = "A", x = rand1M[it])
  rand1M[it] = sub(pattern = "2", replacement = "T", x = rand1M[it])
  rand1M[it] = sub(pattern = "3", replacement = "G", x = rand1M[it])
  rand1M[it] = sub(pattern = "4", replacement = "C", x = rand1M[it])
  it = it + 1
}

Заранее спасибо за ввод!

1 Ответ

1 голос
/ 12 апреля 2019

Упрощение вашего кода, это выглядит так:

y <- sub("1", "A", x)
y <- sub("2", "T", x)
y <- sub("3", "G", x)
y <- sub("4", "C", x)

Значение, полученное при 2-й и 4-й заменах, игнорирует значение, полученное в предыдущих.Вместо этого вы хотите:

y <- sub("1", "A", x)
y <- sub("2", "T", y)  # y, not x, is being acted on
y <- sub("3", "G", y)
y <- sub("4", "C", y)

Ваша третья версия близка к этому, поэтому она работает.

Для более ясного стиля я бы тоже изменил цикл:

for (it in seq_along(rand1M)) {
  rand1M[it] = sub(pattern = "1", replacement = "A", x = rand1M[it])
  rand1M[it] = sub(pattern = "2", replacement = "T", x = rand1M[it])
  rand1M[it] = sub(pattern = "3", replacement = "G", x = rand1M[it])
  rand1M[it] = sub(pattern = "4", replacement = "C", x = rand1M[it])
}

Таким образом, у вас нет загадочной переменной i, и вам не нужно увеличивать it самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...