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

时间:2015-03-10 09:04:33

标签: r

由于我无法提供示例数据,因此这里有两个小文本文件,代表我的两个输入文件的前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))

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

现在,我想

  1. 计算列表中所有数据框中“sbjct”列中因子的出现次数,
  2. 根据计数构建矩阵,其中行=“sbjct”的因子级别和每个数据帧中的列=出现次数。
  3. 对于列表中的每个数据帧,应根据原始列表中的原始数据框创建一个具有两列(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 个答案:

答案 0 :(得分: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
>