我有csv文件,包含600k行和3行,第一个包含疾病名称,第二个包含一个基因,第三个包含一个类似的数字:我有大约4k疾病和16k基因所以有时疾病名称和基因名称是还原剂。
霍乱xx45 12 癌症xx65 1 霍乱xx65 0
我想用R做一个DTM矩阵,我一直试图使用来自tm库的语料库命令,但是语料库并没有减少疾病的数量和规模的600k ish ,我很想了解如何将该文件转换为DTM。
我很抱歉没有这么精确,完全从计算机科学开始作为一个生物人:) 干杯!
答案 0 :(得分:0)
如果您不关心第三栏中的数字,那么您可以使用前两列(基因和疾病)完成我认为您尝试做的事情。
一些模拟数据的示例:
library(data.table)
# Create a table with 10k combinations of ~6k different genes and 40 different diseases
df <- data.frame(gene=sapply(1:10000, function(x) paste(c(sample(LETTERS, size=2), sample(10, size=1)), collapse="")), disease=sample(40, size=100000, replace=TRUE))
table(df)创建一个大矩阵,nGenes行为long,nDiseases列为wide。只看前10行(因为它太大而稀疏)。
head(table(df))
disease
gene 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
AB10 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
AB2 1 1 0 0 0 0 1 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0 1 0 1 0 1
AB3 0 1 0 0 2 1 1 0 0 1 0 0 0 0 0 2 1 0 0 1 0 0 1 0 3 0 1
AB4 0 0 1 0 0 1 0 2 1 1 0 1 0 0 1 1 1 1 0 1 0 2 0 0 0 1 1
AB5 0 1 0 1 0 0 2 2 0 1 1 1 0 1 0 0 2 0 0 0 0 0 0 1 1 1 0
AB6 0 0 2 0 2 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0
disease
gene 28 29 30 31 32 33 34 35 36 37 38 39 40
AB10 0 0 1 2 1 0 0 1 0 0 0 0 0
AB2 0 0 0 0 0 0 0 0 0 0 0 0 0
AB3 0 0 1 1 1 0 0 0 0 0 1 1 0
AB4 0 0 1 2 1 1 1 1 1 2 0 3 1
AB5 0 2 1 1 0 0 3 4 0 1 1 0 2
AB6 0 0 0 0 0 0 0 1 0 0 0 0 0
或者,您可以排除0的计数,仅包括实际存在的组合。可以使用data.table进行简单的聚合,例如(从上面的例子继续)
library(data.table)
dt <- data.table(df)
dt[, .N, by=list(gene, disease)]
给出如下的频率表:
gene disease N
1: HA5 20 2
2: RF9 10 3
3: SD8 40 2
4: JA7 35 4
5: MJ2 1 2
---
75872: FR10 26 1
75873: IC5 40 1
75874: IU2 20 1
75875: IG5 13 1
75876: DW7 21 1