R 在data.table中动态分配/引用列名(在i、j和by中)

R 在data.table中动态分配/引用列名(在i、j和by中),r,data.table,R,Data.table,A) 我们可以使用:=并用()包装变量来计算它,而不是按字面意义进行赋值 library(data.table) cars[ , (strColumnName) := .N, by=speed] 如果我们需要一个总结专栏 setnames(cars[, .N, by = speed], 'N', strColumnName)[] 使用更新的代码 cars[eval(as.name(strFactor)) > 50, .(`Totals:`=.N, x=eval(as.name

A) 我们可以使用
:=
并用
()
包装变量来计算它,而不是按字面意义进行赋值

library(data.table)
cars[ , (strColumnName) := .N, by=speed]  

如果我们需要一个总结专栏

setnames(cars[, .N, by = speed], 'N',  strColumnName)[]

使用更新的代码

cars[eval(as.name(strFactor)) > 50, .(`Totals:`=.N, x=eval(as.name(strFactor))*100), by=speed]
编辑: 根据您的说明,下面是一种使用
setNames
get
的方法。这里的技巧是
指示在调用环境中进行评估

library(data.table)
cars <- data.table(cars)
strFactor <- "dist"
strNewVariable <- "Totals x Factor: "
strBy <- "speed"
cars[ get(strFactor)  > 50, 
     setNames(.(.N * get(..strFactor)),strNewVariable),
     by=strBy] 
库(data.table)

以下车辆不工作
col
cars[,.N,by=速度]
是一个聚合,而不是一个赋值。请澄清您正试图实现什么。对于赋值,有许多具有类似标题的重复项,例如,您需要使用
:=
集合表示法。在我的示例中,可以使用.N而不是任何其他RHS语句。它不是关于
:=
相关:是-我一直在使用我认为这必须通过
get()
来完成!很好!-不过我要编辑我的问题-因为在我的编码实践中,我尝试“自动化”(即动态分配所有变量)
data.table
中的所有部分,即i、j和
by
Awesome!-这是我从现在起将要使用的,唯一的更改是我将使用
eval(as.name(strFactor))
而不是
get(…strFactor)
-正如@akrun所建议的那样,这样就不需要记住一个新的
符号,当我们可以没有它的时候。伊恩,也许你可以把这个可能的修改添加到你的答案中,我会接受它作为最好的答案。+1.
by
参数不需要
eval
-这会起作用
by=strBy
因此,对于喜欢避免使用
get
的人,可以分别使用
cars[[strFactor]]>50
.SD[[strFactor]]
来处理i和j语句。一个更健壮的API也正在开发中:因此
eval(as.name(strFactor))
与get(strFactor)是一样的.酷!不知道。谢谢!@IVIM是的,iit-iis比
get
 cars[ dist > 50, .(`Totals x Factor: ` = .N * dist), by=speed] 
strFactor <- "dist"; 
strNewVariable <- "Totals x Factor: "
strBy <- "speed"
cars[ strFactor > 50, .(strNewVariable = .N * strFactor), by=strBy] 
library(data.table)
cars[ , (strColumnName) := .N, by=speed]  
setnames(cars[, .N, by = speed], 'N',  strColumnName)[]
cars[eval(as.name(strFactor)) > 50, .(`Totals:`=.N, x=eval(as.name(strFactor))*100), by=speed]
library(data.table)
cars <- data.table(cars)
strFactor <- "dist"
strNewVariable <- "Totals x Factor: "
strBy <- "speed"
cars[ get(strFactor)  > 50, 
     setNames(.(.N * get(..strFactor)),strNewVariable),
     by=strBy]