使用两个变量的子集数据并对其进行总结

时间:2016-05-24 15:39:29

标签: r subset reshape2

我有一个包含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以输入频率间隔来概括此信息的表格?

提前致谢。

1 个答案:

答案 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