RL oop для фильтрации по каждому столбцу - PullRequest
3 голосов
/ 19 февраля 2020

У меня есть такой фрейм данных: фрейм данных о генном выражении Предполагается, что имя столбца в качестве разных образцов и имя строки в качестве разных генов. Теперь я хочу узнать количество генов, оставшихся после фильтрации каждого столбца с номером. Например,

sample1_more_than_5 <- df[(df[,1]>5),]
sample1_more_than_10 <- df[(df[,1]>10),]
sample1_more_than_20 <- df[(df[,1]>20),]
sample1_more_than_30 <- df[(df[,1]>30),]

Затем

sample2_more_than_5 <- df[(df[,2]>5),]
sample2_more_than_10 <- df[(df[,2]>10),]
sample2_more_than_20 <- df[(df[,2]>20),]
sample2_more_than_30 <- df[(df[,2]>30),]

Но я не хочу повторяться это 100 раз, так как у меня есть 100 образцов. Кто-нибудь может написать для меня al oop для этой ситуации? Спасибо

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Вот решение с использованием двух циклов, которые вычисляют по каждому образцу (столбцам) число генов (строк), значение которых больше значения, указанного в векторе nums.

#Create the vector with the numbers used to filter each columns
nums<-c(5, 10, 20, 30)

#Loop for each column
resul <- apply(df, 2, function(x){
  #Get the length of rows that have a higher value than each nums entry
  sapply(nums, function(y){
    length(x[x>y])
  })
})

#Transform the data into a data.frame and add the nums vector in the first column
resul<-data.frame(greaterthan = nums,
                  as.data.frame(resul))
3 голосов
/ 19 февраля 2020

Мы можем l oop по столбцам и сделать это и создать группировку с cut

lst1 <- lapply(df, function(x) split(x, cut(x, breaks = c(5, 10, 20, 30))))

или findInterval, а затем split

lst1 <- lapply(df, function(x) split(x, findInterval(x,  c(5, 10, 20, 30))))

Если бы мы go по способу создания объектов в посте ОП, в глобальной среде было бы 100 * 4, то есть 400 объектов (100 столбцов). Вместо этого это может быть один list объект.

Объекты можно создавать, но это не рекомендуется

v1 <- c(5, 10, 20, 30)
v2 <- seq_along(df)
 for(i in v2) {
     for(j in v1) {
      assign(sprintf('sample%d_more_than_%d', i, j), 
               value = df[df[,i] > j,, drop = FALSE])
    }
  } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...