使用两个变量的子集数据并对其进行汇总
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
我有一个包含 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