我有一个示例数据表数据
sampledt<- data.table("BP"=c(seq(c(1:3)),c(1:2)) ,"STATUS"=c(rep("CASE",5),rep("CONTROL",5) ), "value"=c(0.8,0.9,0.10,0.9,0.10))
有列-BP-basepair,状态是case和control。值是按状态分层的每个BP的值。我需要获得按BP和STATUS分组的值的平均值,我使用以下代码获得:
sampledt[,.("meaned_group"=mean(value)),by=.(BP,STATUS)] ## this achieves desired results
但是,我想创建一个函数来执行此任务。有时,我需要简单地通过BP
,或者说通过STATUS
列来获得平均值。或者我不是说我对总和感兴趣。
join_group_datatable<-function(temp_datat,temp_namecolumn,column_value,func_join, list_groupby){
##temp_datat - temp data.table
## temp_namecolumn - output column name - grouped_mean or meaned_group
## column_value column on which function needs to be applied
## func_join - function may be mean, may be sun
## list_groupby - vector of group
temp_datat[,.(temp_namecolumn=func_join(column_value) , by=.(list_groupby))]
}
我设置了功能并运行以下代码行:
join_group_datatable(sampledt,"meaned_group","value",mean,c("BP","STATUS"))
这给了我错误/警告:
Warning message:
In mean.default(column_value) :
argument is not numeric or logical: returning NA
输入数据的类。表值为数字。我无法理解如何使函数传递列名、函数并获得所需的结果。
如果用以下内容替换函数体,它应该可以工作。
temp_datat[, setNames(.(func_join(get(column_value))), temp_namecolumn), by = mget(list_groupby)]
这使用get/mget
和setNames
将函数参数传递到data.table
调用范围中的相关位置。