如何获取data.table的group by中的组名?

Xlr*_*lrv 2 r data.table

我想将一个函数应用于data.table的列,但是我想考虑该函数将应用于哪个组,即我想将该组值作为参数传递给该函数。但是,应用我的功能时,我无法获得组的名称。

如何获得团体价值?还是我应该使用其他方法?

例:

library(data.table)
set.seed(369)
dta <- data.table(gr = 1:5, 
                  a = rnorm(5),  
                  b = rnorm(5),
                  c = rnorm(5),
                  d = rnorm(5))

add <- function(x, y, group){ 
  if(group == 1){
    x + y
  } else{
    x - y
  }
}

dta[, newcol := add(c, d), by = (gr)]
Run Code Online (Sandbox Code Playgroud)

我不知道如何将当前组的值传递给函数

Mat*_*ill 6

注意1:我的快速绘图答案错误地建议使用.GRP,在此特定示例中恰好返回相同的答案。根据@MichaelChirico的建议,.BY是要使用的正确特殊符号。

注意2:感谢@Frank的其他反馈-我在此处创建了关于的实验的快速摘要.BY,并再次更新了答案以正确反映需要按名称引用列表中的分组列。

看起来特殊符号.BY正是您所追求的。要了解有关.BY其他符号的工作方式以及其他符号的更多信息,请help("special-symbols")在控制台中运行以查看文档。

library(data.table)

set.seed(369)
dta <- data.table(gr = 1:5, 
                  a = rnorm(5),  
                  b = rnorm(5),
                  c = rnorm(5),
                  d = rnorm(5))

add <- function(x, y, group){ 
  if(group == 1){
    x + y
  } else{
    x - y
  }
}

dta[, newcol := add(c, d, .BY$gr), by = (gr)]

print(dta)

#    gr          a           b           c            d     newcol
# 1:  1 -0.7506434  1.08042639 -0.57234502 -0.009598695 -0.5819437
# 2:  2  0.8976528 -0.45909601 -0.08179559 -1.359655922  1.2778603
# 3:  3  0.7449628 -0.92638505 -1.11577747  0.654088229 -1.7698657
# 4:  4  0.5811869 -0.07451776 -0.50771981 -1.009298251  0.5015784
# 5:  5 -0.3270194  0.97218850  0.55705663 -0.032128474  0.5891851
Run Code Online (Sandbox Code Playgroud)

注意3:这对于大多数用例也很好用,可能会更直观一些:

dta[, newcol := add(c, d, gr), by = (gr)]
Run Code Online (Sandbox Code Playgroud)

  • .BY是一个列表,但是由于list(1)== 1而碰巧适用于OP的情况。您可以执行`add(c,d,.BY $ gr)`或更笼统的操作,但是不太可读如果名称匹配,请添加c(list(c,d),.BY))`。 (2认同)
  • 我使用它有两个原因:使代码更具可读性(从某种意义上说,我可以清楚地看到我正在使用分组变量),对于.BY vars(例如,使用toString( (.BY)作为剧情标题,或在`j`慢的情况下将`cat`调到控制台,以便我跟踪进度)。这是一个示例:http://franknarf1.github.io/r-tutorial/_book/tables.html(搜索.BY)另外,我认为,在我提到的do.call模式中传递参数也很有用。 (2认同)