我有一个简单的任务,但还是想不出来,我有一个csv二元矩阵,基因为行,样本为列,其中1表示基因存在,0表示基因不存在,样本属于不同的聚类,如:cluster1 = c(sampleA,sampleB,sampleC,sampleD)cluster2 = c(sampleE,sampleF,sampleG)
| 基因|样品A|样品B|样品C|样品D|样品E|样品F|样品G|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 基因1|1个|0|0|1个|0|0|0|
| 基因2|0|0|0|0|1个|1个|0|
| 基因3|0|0|0|0|0|0|1个|
| 基因4|0|1个|0|0|0|0|0|
| 基因5|1个|1个|1个|1个|0|0|0|
| 基因6|1个|1个|1个|1个|0|0|0|
| 基因7|0|0|0|1个|1个|0|0|
| 基因8|0|0|0|0|0|0|0|
| 基因9|1个|0|0|1个|0|0|0|
| 基因1|0|0|0|0|0|0|0|
| 基因11|1个|0|0|1个|0|0|0|
| 基因12|0|0|0|0|1个|1个|1个|
| 基因13|0|0|0|0|1个|1个|1个|
| 基因14|0|0|0|0|0|0|0|
| 基因15|0|0|0|0|0|0|0|
| 基因16|1个|0|0|0|0|0|0|
| 基因17|1个|0|0|1个|0|0|0|
| 基因18|1个|0|0|1个|0|0|0|
| 基因19|1个|0|0|1个|0|0|0|
| 基因20|1个|0|0|1个|0|0|0|
我需要找出哪些基因只出现在一个聚类中,而在所有其他聚类中都不存在,这意味着,我想根据基因只出现在一个聚类中来对列进行子集化/过滤,如下所示:
集群1:
| 样品A|样品B|样品C|样品D|样品E|样品F|样品G|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 基因5|1个|1个|1个|1个|0|0|
| 基因6|1个|1个|1个|1个|0|0|
集群2:
| 样品A|样品B|样品C|样品D|样品E|样品F|样品G|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 基因12|0|0|0|0|1个|1个|
| 基因13|0|0|0|0|1个|1个|
我的原始数据集包含8212个基因和23个样本,分为8个不同的簇:
cluster1 <- c("sampleA", "sampleB", "sampleC", "sampleD", "sampleE", "sampleF", "sampleG", "sampleH",
"sampleI", "sampleJ", "sampleK", "sampleL", "sampleM", "sampleN", "sampleO")
cluster2 <- c("sampleP")
cluster3 <- c("sampleQ", "sampleR")
cluster4 <- c("sampleS")
cluster5 <- c("sampleT")
cluster6 <- c("sampleU")
cluster7 <- c("sampleV")
cluster8 <- c("sampleZ")
Here is an example file
有没有简单的方法用R或bash?谢谢
5条答案
按热度按时间wydwbb8l1#
更新4/13/23:
这将保留所有其他附加列
广义:
-for循环
jrcvhitl2#
首先创建两个变量来保存列名:
我使用的是基本R和Dyplr函数的组合。如果一个条件为真,另一个条件为假,xor返回真。如果两个条件都为真或假,则返回假。
zzwlnbp83#
更新(删除之前的解决方案):以下是
dplyr
方法:smdnsysy4#
在分层聚类之后选择聚类,在本例中为5和7。
选择所需群集编号的直观帮助
iovurdzv5#
这可能就是您要尝试做的事情,在每个Unix机器上的任何shell中使用任何awk:
以上是针对此输入文件运行的: