【发布时间】:2018-03-14 04:42:22
【问题描述】:
我正在尝试使用 data.table Cran R 包中包含的各种功能的引用或控件来规范化数据。
我的表格可能如下所示(包含更多行和更多功能/分组列):
myDF <- data.table(
Grouping=rep(c("P1","P2"),each=6),
type = rep(c(rep("samp",times=4),"CRTL","CRTL"),times=2),
ID= rep(1:6, times=2),
feat1 = rnorm(12),
feat2 = rnorm(12)
)
这会生成以下数据表(这是本次运行的输出):
Grouping type ID feat1 feat2 1: P1 samp 1 0.9852 0.24133 2: P1 samp 2 0.2358 1.26750 3: P1 samp 3 1.2034 2.19410 4: P1 samp 4 0.5468 -0.42462 5: P1 CRTL 5 0.3997 0.95686 6: P1 CRTL 6 0.9915 -1.41417 7: P2 samp 1 0.6461 -1.19252 8: P2 samp 2 0.7926 -0.68735 9: P2 samp 3 0.9408 0.07738 10: P2 samp 4 0.2759 1.37948 11: P2 CRTL 5 1.0898 -0.07205 12: P2 CRTL 6 0.5325 1.21850
我想规范化,以便对于每个Grouping,对于每个type,feat1 和 feat2 的中值(在我的实际情况下,这将是一个非常长的功能列表)是除以(标准化)'CRTL'类型的中值。
我能够使用下面的代码实现这一点,但我希望有一种更优雅(更快)的方法来做到这一点。这是我使用的代码:
cols_grouping=c('Grouping', 'type')
cols_features=c('feat1','feat2')
setkeyv(myDF,"Grouping")
myDF_norm=myDF[,lapply(.SD, median, rm.NA=TRUE), .SDcols=cols_features, by=cols_grouping]
setkeyv(myDF_norm,"Grouping")
crt_normalization = function(sub_table){
for (col in cols_features) {
i_col=paste0("i.",col)
sub_table[[col]]=sub_table[[col]]/sub_table[[i_col]]
sub_table[[i_col]]=NULL
}
return(sub_table)
}
myDF_norm=myDF_norm[
myDF_norm[type == "CRTL",
c("Grouping",cols_features),
with=FALSE]
][,crt_normalization(.SD),by='Grouping']
这将返回正确规范化的表:
Grouping type feat1 feat2 1: P1 samp 2.0629 -3.2994 2: P1 CRTL 1.0000 1.0000 3: P2 samp 0.2282 -0.5321 4: P2 CRTL 1.0000 1.0000
希望您有一个依赖于 data.table 的方法,它可能更优雅、更高效
【问题讨论】:
标签: r data.table bigdata normalization