首页 文章

从数据帧列表中的因子级别出现创建计数矩阵

提问于
浏览
0

由于我不能提供示例数据,这里有两个小文本文件,代表我的两个输入文件的前5行:

https://www.dropbox.com/sh/s0rmi2zotb3dx3o/AAAq0G3LbOokfN8MrYf7jLofa?dl=0

我将工作目录中的所有文本文件读入列表,在第三列中按数字截止值剪切了一些列,set new names和子集:

all.files <- list.files(pattern = ".*.txt")
data.list <- lapply(all.files, function(x)read.table(x, sep="\t"))
names(data.list) <- all.files
data.list <- lapply(data.list, function(x) x[,1:3])

new.names<-c("query", "sbjct", "ident")

data.list <- lapply(data.list, setNames, new.names)
new.list <- lapply(data.list, function(x) subset(x, ident>99))

我最终得到一个数据帧列表,每个数据帧由三列组成 .

现在,我想

  • 计算列表中所有数据框中"sbjct"列中因子的出现次数,并且

  • 根据计数构建矩阵,其中行=每个数据帧中"sbjct"和columns =出现的因子级别 .

对于列表中的每个数据帧,应根据原始列表中的原始数据框创建一个具有两列(sbjct / counts)的新对象 . 最后,所有新对象都应该与cbind合并(例如),空单元格(缺少数据)应该用零填充,从而产生“sbjct x counts”矩阵 .

例如,如果我有一个数据帧,dplyr会帮我这样:

library(dplyr)
some.object <- some.dataframe %>% 
                  group_by(sbjct) %>%
                    summarise(counts = length(sbjct))

>some.object
Source: local data frame [5 x 2]

            sbjct counts
1 AB619702.1.1454       1
2 EU287121.1.1497       1
3 HM062118.1.1478       1
4 KC437137.1.1283       1
5        Yq2He155       1

但它似乎无法应用于数据帧列表 .

1 回答

  • 1

    向每个数据集添加一列,作为指标[让Ndata命名]特定观察来自该数据集 . 现在rbind所有这些数据集 .

    现在当你创建一个sbjct X Ndata的交叉表时,你将得到你正在寻找的矩阵 .

    这里有一些代码要澄清:

    t=c("a","b","c","d","e","f")
    set.seed(10)
    d1=data.frame(sbjt=sample(t,sample(20,1),rep=T))
    d2=data.frame(sbjt=sample(t,sample(20,1),rep=T))
    d3=data.frame(sbjt=sample(t,sample(20,1),rep=T))
    
    d1$Ndata=rep("d1",nrow(d1))
    d2$Ndata=rep("d2",nrow(d2))
    d3$Ndata=rep("d3",nrow(d3))
    
    all=rbind(d1,d2,d3)
    
    ct=table(all$sbjt,all$Ndata)
    

    ct看起来像这样:

    > ct
    
        d1 d2 d3
      a  1  0  0
      b  4  0  1
      c  2  2  1
      d  3  1  0
      e  1  0  0
    >
    

相关问题