R l oop до тех пор, пока условие не будет выполнено путем изменения входных данных - PullRequest
0 голосов
/ 06 мая 2020

У меня есть набор данных Rna-seq (строки = образцы, столбцы = гены), который входит в функцию кластеризации. Гены сгруппированы в n кластеров, помеченных номерами, где гены, принадлежащие кластеру 0, являются некластеризованными генами. Сгруппированные в кластеры возвращаются к кластеризации, и снова мы получаем n кластеров, помеченных числами, где 0 снова является некластеризованными генами. Процесс продолжается до тех пор, пока никакие другие гены не будут классифицированы в кластер 0. Мне нужно l oop into через этот процесс, чтобы вернуть окончательный результат кластеризации вместе с объединением генов, принадлежащих кластеру 0, на каждой итерации. Я знаю, что это можно сделать с помощью , а или повторения . У меня была попытка использовать repeat , но это не работает, и проблема в том, что я не совсем понимаю, как это правильно настроить.

#define my dataset
dat<-my_dataset

repeat{
  #run the clustering
  aa<-cluster(dat)
    #if the cluster 0 has length 0 (no genes), assign clustering results to Mod and stop the loop
    if (length(which(aa$colors==0))==0){
    Mod<-aa
    break
    #otherwise, store the genes belonging to cluster 0 and set up a new dataset made up by clustered genes
    } else{
    noPass<-rownames(dat)[aa$colors==0]
    dat<-dat[,which(aa$colors!=0)]
    }
  return(list(aa,noPass))
  }

Любое предложение действительно приветствуется.

1 Ответ

0 голосов
/ 06 мая 2020

Звучит как подходящая проблема для рекурсии: определить функцию, которая будет кластеризовать элементы в своем аргументе; если из кластеризации не осталось ни одного элемента, возвращающего элементы, в противном случае вызывайте себя, используя только те элементы, которые все еще присутствуют, и так далее, пока не останется ни одного элемента.

cluster_until_none_left_out = function( elements ) {
    aa=cluster(data[elements])
    if (sum(aa$colors==0)==0) { return( list(aa,elements) ) }
    else{ return( cluster_until_none_left_out(elements[aa$colors!=0]) ) }
}

Немного сложно предоставить полный работающий пример без каких-либо реальных данных, но вот очень простой пример, использующий фиктивные данные, состоящие из вектора случайных целых чисел, которые имитирующая функция «кластеризации» разбивает. на те, которые больше половины среднего (одиночный «кластер»), и те, которые меньше этого (оставленные, «некластеризованные» элементы).

data=sample(1:100)

cluster = function(vec) {
    answer=data.frame(vec)
    answer$colors=ifelse(vec>mean(vec)/2,1,0)
    return(answer)
}

sum(cluster(data)==0) 
# shows that one round of clustering leaves some elements in cluster 0

initial_elements=1:100
clustering_elements=cluster_until_none_left_out(initial_elements)[[2]]

sum(cluster(data[clustering_elements])==0)
# 0 (now nobody left in cluster 0)

Теперь выполняется окончательная кластеризация возвращается вместе с индексами используемых элементов. Остальные элементы (кластер 0) - это все остальные.

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