R: Получить диапазон и частоту в пределах интервала для каждого столбца? - PullRequest
0 голосов
/ 11 июля 2020

У меня ~ 300 строк, каждая из которых представляет ген, и ~ 30 категорий в виде столбцов. Мой набор данных выглядит примерно так:

   Gene   bile_duct
1 ABCA2 -0.01319722
2 ABCA3 -0.06648552
3 ABCA5 -0.05049298

Я пытаюсь 1) вычислить частоту генов в определенном диапазоне [-3, -1] для каждого столбца и 2) составьте реальный список генов в ранее упомянутом диапазоне.

Я не знаю, как подойти к (2). Для (1) мой подход не работает, но он пытается сначала вырезать данные, а затем использовать lapply с функцией диапазона:

breaks = seq(-3,-1, by=2)
cut_lineage <- lapply(lineage_genes[,-1],cut,breaks)
cut_lineage <- lapply(cut_lineage,range)

Ответы [ 3 ]

0 голосов
/ 11 июля 2020

Вы можете попробовать это решение в base R:

# Data

Data2 <- structure(list(Gene = structure(1:3, .Label = c("ABCA2", "ABCA3", 
"ABCA5"), class = "factor"), bile_duct = c(-0.01319722, -0.06648552, 
-0.05049298), bile_duct2 = c(-0.01319722, -0.06648552, -0.05049298
)), class = "data.frame", row.names = c(NA, -3L))

#Function
cuts <- function(x,a,b)
{
  y<-ifelse(x>=a & x<=b,1,0)
  return(y)
}

cuts(-1.5,a = -3,b = -1)
#Apply function and create a copy of data
Data3 <- Data2
Data3[,-1] <- apply(Data2[,-1],2,cuts,a = -3,b = -1)

#Obtain sums for all columns
Sum <- colSums(Data3[,-1])
#Summary by gene
aggregate(.~Gene,data=Data3,FUN = sum,na.rm=T)

Sum
bile_duct bile_duct2 
         0          0 

Агрегация должна измениться с появлением дополнительных данных, показывающих количество значений:

   Gene bile_duct bile_duct2
1 ABCA2         0          0
2 ABCA3         0          0
3 ABCA5         0          0

Надеюсь, это поможет.

0 голосов
/ 12 июля 2020

Следующие строки сохранят нужные вам частоты во фрейме данных.

freqs = data.frame(col = '', n = NA)
for (i in 2:ncol(data)) {
    freqs = rbind(freqs, 
                data.frame(
                        col = names(data[i]), 
                        n = nrow(data[which(data[,i] >= -3 & data[,i] <= -1), ])
                    )
                )
}
freqs = freqs[-1,]

И следующие строки сохранят фактические гены в объекте списка. Каждый элемент в объекте списка предназначен для одного из столбцов.

lists = vector('list', ncol(data)-1)

for (i in 2:ncol(data)) {

    lists[[i]] = data[which(data[,i] >= -3 & data[,i] <= -1), 1]

}

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

0 голосов
/ 11 июля 2020

Мы можем использовать base R. Если мы хотим получить диапазон значений в одном окне, подмножество данных с помощью > или < и применение range поверх него

lapply(lineage_genes[,-1], function(x) range(x[x >= -3 & x <=-1]))

Если нам нужен список «Gene» вместо подмножества значения, подмножество 'Gene'

lapply(lineage_genes[,-1], function(x) lineage_genes$Gene[x >= 3 & x <= -1])

В коде OP мы возвращаем группы с cut вместо фактических значений столбцов, и это тип factor. Таким образом, range применяется к группе вырезок, а не к подмножеству значений

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