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

Subset Data Using Two Variables and Summarize it

我有一个包含 3 列的 data.frame。我有许多不同的 "strains" 和许多不同的 "TE" 与它们的频率相匹配。我想要做的是让每个 TE 知道对于给定的 TE 频率值,有多少应变在同一范围内。

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% 的频率,我会得到 FBti0015567 (S1 + S2) 的 2 和 FBti0018865 (S2) 的 1。

TE num_strains 
FBti0015567 2
FBti0018865 1

对于 >20% 的查询

TE num_strains 
FBti0015567 1
FBti0018865 2

我天真的方法是为每个值组合创建一个子集,但这是不可行的,因为我有 40 多个菌株和 1400 多个 TE。 有没有一种简单的方法可以通过 TE 以输入频率间隔获得 table 汇总此信息?

提前致谢。

如果我正确地解释了这个问题,您需要每个 TE 和 TE 频率组合的独特菌株的数量。 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

我假设 "filtering by frequencies lower than 10%" 你的意思是删除 TE 频率 < 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