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

时间:2019-03-14 15:21:02

标签: 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)]

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

1 个答案:

答案 0 :(得分:6)

  

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

     

注2:感谢@Frank的其他反馈-我对.BY进行了一些实验,快速创建了gist here,并再次更新了答案以正确反映对参考的需求按名称列出列表中的分组列。

看起来就像特殊符号.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
  

注3:这在大多数情况下也可以使用,并且可能更直观:

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