#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)
агрегировании вообще нет необходимости (и обычно это происходит намного быстрее).