【问题标题】:R loop until condition is met by changing input dataR循环直到通过更改输入数据满足条件
【发布时间】:2020-08-21 18:19:47
【问题描述】:

我有一个 Rna-seq 数据集(行 = 样本,列 = 基因),它进入了一个聚类函数。这些基因被分成n个用数字标记的簇,其中属于簇0的基因是非簇基因。聚集的那些又回到聚集中,我们再次得到 n 个用数字标记的簇,其中 0 再次是非聚集基因。该过程继续进行,直到没有进一步的基因被分类到集群 0 中。我需要循环进入这个过程,以便在每次迭代时返回最终的集群结果以及属于集群 0 的基因的联合。我知道这可以通过 whilerepeat 来完成。我曾尝试使用 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))
  }

非常感谢任何建议。

【问题讨论】:

    标签: r loops while-loop


    【解决方案1】:

    这听起来像是一个适合递归的问题: 定义一个函数,将其参数中的元素聚集在一起;如果聚类中没有遗漏,则返回元素,否则仅使用仍在其中的元素调用自身,依此类推,直到没有遗漏。

    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 ]
    

    【讨论】:

    • 感谢@Dominic Van Essen 的努力。正如您所说,您提供的示例很简单,但我会尝试使您的代码结构适合我的数据;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2018-11-09
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2016-04-12
    相关资源
    最近更新 更多