Начнем с использования библиотеки 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.
Надеюсь, это поможетПожалуйста, не стесняйтесь спрашивать, если это необходимо.
С уважением,
Алексис