我有一个包含3列的data.frame。我有许多不同的“应变”,许多不同的“TE”与它们的频率相匹配。我想要做的是每个TE知道给定TEfrequency值在相同范围内有多少菌株。
dt <- as.data.table(read.table(header=TRUE,text=" strain TE TEfrequency
1 S1 FBti0015567 0.000000
2 S2 FBti0015567 0.000000
3 S3 FBti0015567 42.857143
4 S1 FBti0018865 25.000000
5 S2 FBti0018865 3.225806
6 S3 FBti0018865 33.333333"))
> head(dt)
strain TE TEfrequency
1 S1 FBti0015567 0.000000
2 S2 FBti0015567 0.000000
3 S3 FBti0015567 42.857143
4 S1 FBti0018865 25.000000
5 S2 FBti0018865 3.225806
6 S3 FBti0018865 33.333333
例如,在FBti0015567的虚拟数据集中
如果我想查询低于10%的频率,我会得到2为FBti0015567(S1 + S2)和1为FBti0018865(S2)。
TE num_strains
FBti0015567 2
FBti0018865 1
查询&gt; 20%
TE num_strains
FBti0015567 1
FBti0018865 2
我天真的方法是为每个值组合制作一个子集,但这是不可行的,因为我有超过40个菌株和超过1400个TE。 是否有一种简单的方法可以获得TE以输入频率间隔来概括此信息的表格?
提前致谢。
答案 0 :(得分:2)
如果我正确地解释了这个问题,你想要每个TE&amp; TEfrequency组合独特菌株的数量。 Data.table非常棒,如果你愿意,可以一步完成。
library(data.table)
dt <- as.data.table(read.table(header=TRUE,text=" strain TE TEfrequency
1 S1 FBti0015567 0.000000
2 S2 FBti0015567 0.000000
3 S3 FBti0015567 42.857143
4 S1 FBti0018865 25.000000
5 S2 FBti0018865 3.225806
6 S3 FBti0018865 33.333333"))
dt[,list(count_uniq_strain=length(unique(strain))),by=list(TE,TEfrequency)][TEfrequency < 10]
TE TEfrequency count_uniq_strain
1: FBti0015567 0.000000 2
2: FBti0018865 3.225806 1
我假设“按低于10%的频率过滤”你的意思是用TEfrequency&lt; 10。
编辑:添加查询功能:
dt2<-dt[,list(count_uniq_strain=length(unique(strain))),by=list(TE,TEfrequency)]
query <- function(inds,condition){
return(inds[eval(parse(text=condition))])
}
filter_gt_20 <- query(inds=dt2,condition="TEfrequency > 20")
filter_lt_10 <- query(inds=dt2,condition="TEfrequency < 10")
> filter_gt_20
TE TEfrequency count_uniq_strain
1: FBti0015567 42.85714 1
2: FBti0018865 25.00000 1
3: FBti0018865 33.33333 1
> filter_lt_10
TE TEfrequency count_uniq_strain
1: FBti0015567 0.000000 2
2: FBti0018865 3.225806 1