我想将一个函数应用于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)
我不知道如何将当前组的值传递给函数
注意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)