R 在data.table中动态分配/引用列名(在i、j和by中)
A) 我们可以使用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
:=
并用()
包装变量来计算它,而不是按字面意义进行赋值
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)
以下车辆不工作colcars[,.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]