首页 > 解决方案 > R数据框中共享组件的数量

问题描述

我有一个数据框如下:

deput(data)

structure(list(genome = c("A", "A", "A", "A", "B", "B", "B", 
"B"), gene = c("esaA", "esaB", "esaC", "esaC", "essA", "essB", 
"essC", "esaA")), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -8L), spec = structure(list(cols = list(
genome = structure(list(), class = c("collector_character", 
"collector")), gene = structure(list(), class = c("collector_character", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"))

我对每个基因组之间共享的项目数量感兴趣,例如在 A 和 B 之间它是 1。我可以在循环中执行此操作(非常非常缓慢):

out=NULL
for(i in guuids){
print(i)
m<-filter(data,genome==i)
g<-unique(m$gene)
for(z in guuids){
print(z)
p<-filter(data,genome==z)
p<-filter(p,gene %in% g)
p<-nrow(p)
out=rbind(out,data.frame(i,z,p))
}
}

但这显然不能扩展,肯定有更好的方法吗?

标签: r

解决方案


table可以为你数数:

table(df)
      gene
genome esaA esaB esaC essA essB essC
     A    1    1    2    0    0    0
     B    1    0    0    1    1    1

table(df[,c('gene','genome')])
      genome
gene   A B
  esaA 1 1
  esaB 1 0
  esaC 2 0
  essA 0 1
  essB 0 1
  essC 0 1

返回的对象是一个矩阵,因此您可以简单地测试哪些行/矩阵有多个非零条目。


推荐阅读