Создайте функцию для перебора переменных таблицы данных и добавления счетчиков

#r #data.table

#r #data.table

Вопрос:

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

Вот рабочий код, но это не функция:

 a = data.table(x=c(1,2,3,3,1), y=c(3,4,4,23,3))
setkey(a, "x", "y")
a[,x_cnt := .N, by=list(x)]
a[,y_cnt := .N, by=list(y)]
> a
   x  y x_cnt y_cnt
1: 1  3     2     2
2: 1  3     2     2
3: 2  4     1     2
4: 3  4     2     2
5: 3 23     2     1
  

Вот мой код на данный момент:

 a = data.table(x=c(1,2,3,3,1), y=c(3,4,4,23,3))
my.f1cnt <- function(ds, variable_list)
{
    for(var in variable_list)
    {
        setkey(ds, var)
        ds[,paste0(var, "_cnt") := .N, by=list(var)]
    }
    #return
    ds
}

my.f1cnt(a, c("x","y"))
Error in setkeyv(x, cols, verbose = verbose) : 
  some columns are not in the data.table: var
  

Ответ №1:

Это работает с setkeyv:

 my.f1cnt <- function(ds, variable_list)
{
    for(var in variable_list)
    {
        setkeyv(ds, var)
        ds[,paste0(var, "_cnt") := .N, by=var]
    }
    #return
    ds
}
a = data.table(x=c(1,2,3,3,1), y=c(3,4,4,23,3))
my.f1cnt(a, c("x","y"))
  

Комментарии:

1. Обратите внимание, что в setkey(v) агрегировании вообще нет необходимости (и обычно это происходит намного быстрее).