Удаление строки в R - PullRequest
       3

Удаление строки в R

2 голосов
/ 24 апреля 2020

Ранее я задавал вопрос

Создание комбинаций кодонов ДНК в R

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

Моя попытка

library(ape)

codon.tbl <- "vertebrate mitochondrial"

pos1 <- c("a", "c", "g", "t")
pos2 <- c("a", "c", "g", "t")
pos3 <- c("a", "c", "g", "t")

codons <- expand.grid(pos1, pos2, pos3)
codons <- paste0(codons$Var1, codons$Var2, codons$Var3)

# Exclude stop codons

if (codon.tbl == "standard") {
  stop.codons <- c("taa", "tag", "tga")
} else if (codon.tbl == "vertebrate mitochondrial") {
  stop.codons <- c("aga", "agg", "taa", "tag")
} else {
  # invertebrate mitochondrial
  stop.codons <- c("taa", "tag")
}

codons <- codons[which(codons != stop.codons)] # problematic line

Строка кода, приведенная выше, должна содержать только 60 элементов, поскольку, когда codon.tbl == "митохондриальный позвоночный", 4 возможных стоп-кодона; вместо этого «кодоны» содержат 62 элемента.

Когда я запускаю код, «кодоны» по-прежнему содержат строки «agg» и «taa»; только "aga" и "tag" были удалены.

Я не уверен, почему это происходит

1 Ответ

0 голосов
/ 24 апреля 2020

Мы можем использовать %in% и отрицать (!) вместо !=, потому что 'stop.codons' length больше 1 и == или != работает как поэлементное сравнение

out <- codons[!codons %in% stop.codons] 
any(c('agg', 'taa') %in% out)
#[1] FALSE

В качестве простого примера

v1 <- 1:5
v2 <- 2:3
v1 == v2
#[1] FALSE FALSE FALSE FALSE FALSE

здесь первый элемент v1, то есть 1, сравнивается с 2, затем с 3, а затем с третьим элементом v1 то есть 3 с 2 (рециркуляция более короткого вектора).

При использовании %in% для всего vector проверяется наличие элемента

v1 %in% v2
#[1] FALSE  TRUE  TRUE FALSE FALSE

или с помощью setdiff, если дубликатов нет

setdiff(codons, stop.codons)

Или используйте vsetdiff из vecsets

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