Замена ячеек NA на строку в R-кадре - PullRequest
0 голосов
/ 30 сентября 2019

Я написал функцию, которая "очищает" таксономические данные из таксономических файлов NGS. Проблема в том, что я не могу заменить ячейки NA строкой типа «undefined». Я знаю, что это как-то связано с тем, что переменные превращаются в факторы, а не в символы ( Предупреждение: в `...`: недопустимый уровень фактора, NA генерирует ), однако даже при импорте данных с stringsAsFactors = FALSE Я все еще получаю эту ошибку в некоторых клетках.

Вот как я импортирую данные:

raw_data_1 <- taxon_import(read.delim("taxonomy_site_1/*/*/*/taxonomy.tsv", stringsAsFactors = FALSE))

Функция taxon_import используется для разделения таксонов и присвоения имен переменных:

taxon_import <- function(data) {
  data <- as.data.frame(str_split_fixed(data$Taxon, ";", 7))
  colnames(data) <- c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species")
  return(data)
}

ТеперьСледующая функция используется для «очистки» данных, и здесь я хотел бы заменить определенные строки на «Undefined», однако я продолжаю получать сообщение об ошибке: In [<-. factor <code>( tmp , thisvar, value = "Undefined") : invalid factor level, NA generated

Далее следует функция data_cleanup:

data_cleanup <- function(data) {
  strip_1 = list("D_0__", "D_1__", "D_2__", "D_3__", "D_4__", "D_5__", "D_6__")
  for (i in strip_1) {
    data <- as.data.frame(sapply(data, gsub, pattern = i, replacement = ""))
  }
  data[data==""] <- "Undefined"
  strip_2 = list("__", "unidentified", "Ambiguous_taxa", "uncultured", "Unknown", "uncultured .*", "Unassigned .*", "wastewater Unassigned", "metagenome")
  for (j in strip_2) {
    data <- as.data.frame(sapply(data, gsub, pattern = j, replacement = "Undefined"))
  }
  return(data)
}

Функция применяется просто так: test <- data_cleanup(raw_data_1)

Я добавляю данные изОблако, так как это очень длинные данные. Вот ссылка на файл данных https://drive.google.com/open?id=1GBkV_sp3A0M6uvrx4gm9Woaan7QinNCn

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

1 Ответ

1 голос
/ 01 октября 2019

Начнем с использования библиотеки Tidyverse. Позвольте мне обратить ваше внимание на вопрос, касающийся замены NA, но я думаю, что с помощью этого кода вы должны избежать этой проблемы.

Когда я читаю ваш код, вы стираете строки "D_0__", "D_1__", ... из строк наблюдения. Затем вы заменяете строки «Ambiguous_taxa», «неопознанный», ... на строку «Undefined».

Согласно вашим данным, я заменил функции на регулярное выражение, что немного облегчает очистку ваших данных. :

library(tidyverse)
taxon_import <- function(data) { 
data <- as.data.frame(str_split_fixed(data$Taxon, ";", 7))
colnames(data) <- c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species")
return(data)
}
raw_data_1 <- taxon_import(read.delim("taxonomy.tsv", stringsAsFactors = FALSE))
raw_data_1 <- data.frame(lapply(raw_data_1,as.character),stringsAsFactors = FALSE)
depured <- as.data.frame(sapply(raw_data_1,function(x) sub("^D_[0-6]__","",x)), stringAsFactors = FALSE)
depured <- as.data.frame(sapply(depured,function(x) sub("__|unidentified|Ambiguous_taxa|uncultured","Undefined",x)), stringsAsFactors = FALSE)
depured <- as.data.frame(sapply(depured,function(x) sub("Unknown|uncultured\\s.\\*|Unassigned\\s.\\*","Undefined",x)), stringsAsFactors = FALSE)
depured <- as.data.frame(sapply(depured,function(x) sub("wastewater\\sUnassigned|metagenome","Undefined",x)), stringsAsFactors = FALSE)
depured[depured ==""] <- "Undefined"

Позвольте мне объяснить мой код. Во-первых, я читал на многих сайтах, что лучше избегать петель, как «для». Итак, как заменить текст, начинающийся с «D_0 __»?

Ответ - регулярное выражение (регулярное выражение). Сначала это кажется сложным, но с практикой это будет полезно. См. Это выражение:

"^D_[0-6]__"

Это означает: «Возьмите начало строки, которая начинается с« D_ »и следует за числом от 0 до 6 и следует за« __ »

Ага. Таким образом, вы можете использовать функцию sub

sub("^D_[0-6]__","",string)

, которая гласит: замените регулярное выражение пробелом "" в строке.

Теперь вы видите другое регулярное выражение:

"__|unidentified|Ambiguous_taxa|uncultured"

Это означает: выберите строку «__» или «неопознанный» или «Ambiguous_taxa» ...

Будьте осторожны с этим регулярным выражением

"Unknown|uncultured\\s.\\*|Unassigned\\s.\\*"    

это означает: выберите строку"Неизвестно" или "некультурно. *" Или ...

пробел, представленный \ s, и звездочка \ *

А теперь как насчет функции as.data.frame? Каждый раз, когда я использую его, мне нужно сделать его "stringsAsFactors = FALSE", потому что функция пытается использовать символы в качестве факторов.

С этим кодом не создается NA.

Надеюсь, это поможетПожалуйста, не стесняйтесь спрашивать, если это необходимо.

С уважением,

Алексис

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