AS
Size: a a a
AS
IS
IS
AS
MV
subset
.phyloseq
?subset()
для датафреймов (код в самом низу). Я бы хотела применить эту функцию к списку выражений (который у меня формируется автоматически из названия фактора и нужных его уровней), но что-то идет не так...multisubset_samples()
, которая возвращает список сабсетов?# Обычный subset для data.frame работаетUPD:
dfr <- data.frame(group = c("A", "A", "B", "A", "B"), value = 1:5)
conditions <- list(expression(group == "A" & value < 3),
expression(group == "A"),
expression(group == "B"))
lapply(conditions, function(x) subset(dfr, eval(x)))
# Создаем объект phyloseq
# if (!requireNamespace("BiocManager", quietly = TRUE))
# install.packages("BiocManager")
# BiocManager::install("phyloseq")
library("phyloseq")
OTU <- otu_table(matrix(1:20, ncol = 4), taxa_are_rows = TRUE)
samples <- sample_data(dfr)
mb <- phyloseq(OTU, samples)
# С одним условием все работает
subset_samples(mb, group == "A")
# Со списком условий - нет
lapply(conditions, function(x) subset_samples(mb, eval(x)))
# Error in eval(x) : object 'value' not found
# Исходный код `subset_samples`
# function (physeq, ...)
# {
# if (is.null(sample_data(physeq))) {
# cat("Nothing subset. No sample_data in physeq.\n")
# return(physeq)
# }
# else {
# oldDF <- as(sample_data(physeq), "data.frame")
# newDF <- subset(oldDF, ...)
# if (class(physeq) == "sample_data") {
# return(sample_data(newDF))
# }
# else {
# sample_data(physeq) <- sample_data(newDF)
# return(physeq)
# }
# }
# }
library("onehot")
multisubset_samples <- function (physeq, fact)
{
if (is.null(sample_data(physeq))) {
cat("Nothing subset. No sample_data in physeq.\n")
return(physeq)
}
else {
groups <- levels(fact)
dfr <- data.frame(fact)
fltr <- predict(onehot(dfr), dfr)
colnames(fltr) <- (gsub("fact=", "", colnames(fltr)))
fltr <- as.list(data.frame(fltr>0))
oldDF <- as(sample_data(physeq), "data.frame")
newDF_list <- lapply(fltr, function(x) subset(oldDF, eval(x)))
if (class(physeq) == "sample_data") {
res <- lapply(newDF_list, sample_data)
return(res)
}
else {
n <- length(fltr)
res <- vector(mode = "list", length = n)
for(i in 1:n) {
res[[i]] <- physeq
sample_data(res[[i]]) <- sample_data(newDF_list[[i]])
}
return(res)
}
}
}
PU
MV
ГД
ГД
PU
PU
MV
MV
М
PD
𝖀
МA