функция для data.table для выполнения группировки по действиям - PullRequest
0 голосов
/ 03 августа 2020

У меня есть образец данных. Таблица данных

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 - базовая пара, статус, то есть регистр и контроль. Стоимость - это величина АД, стратифицированная по статусу. Мне нужно получить среднее значение, сгруппированное по 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

Класс входных данных. значение таблицы - numeri c. Я не могу понять, как заставить функцию передавать имена столбцов, функцию и получать желаемые результаты.

1 Ответ

1 голос
/ 03 августа 2020

Если вы замените тело функции следующим, оно должно работать.

temp_datat[, setNames(.(func_join(get(column_value))), temp_namecolumn), by = mget(list_groupby)]

Здесь используются get/mget и setNames для передачи параметров функции в соответствующие места в вызывающей области data.table .

...