非常抱歉,这个问题可能表明我通常使用Python/pandas,但我现在却遇到了困难。我如何使用字符串选择一个 data.table
的列?
dt$"string"
dt$as.name("string")
dt$get("string")
我相信这非常简单,但我不理解。非常感谢任何帮助!
-------------- 编辑以添加 ----------------------
在下面一些有用的评论和提示之后,我认为我已经将问题缩小了,并且有了一个可重现的例子。请看:
dt = data.table(ID = c("a","a","a","b","b","b"), col1=rnorm(6), col2=rnorm(6)*100)
假设我们想要将
col2
中的值分配给 col1
。根据我所学,data.table
的语法应该是 dt[,col1:=col2]
,这很简单明了。但当 j
参数中的一个或两个变量为字符串时,则出现问题。我找到了以下信息:
dt[, "col1":=col2]
像预期的那样工作
dt[, "col1":="col2"]
失败,因为它试图将字符 col2
分配给双精度向量 col1
dt[, "col1":=get("col2")]
像预期的那样工作
dt[, get("col1")]
像预期的那样返回 col1
但是:dt[, get("col1"):=col2]
或任何其他赋值操作均失败。
一些背景:我这样做的原因是,我正在循环中构造字符串,以访问名为 colname_colnumber
的大量列,即我循环遍历 colname
和 colnumber
,然后访问列paste0(colname,colnumber)
。
dt$"string"
应该完美地工作,具体是什么错误?虽然$
右侧的表达式永远不会起作用,请参见此FAQ。 - David Arenburg$paste(x,y)
的东西,然后在提问之前忘记尝试不使用表达式! - Nils Gudatdt[,"col1":=get("col2")]
这个选项不能满足您的需求,例如for (ii in 1:2) dt[,paste0("col",ii):=get("col2")]
看起来是您想要的。也许您需要扩大示例的范围。 - MichaelChiricovar<-paste0("col","1")
,我将不得不再次依赖于get()
方法,但它不起作用。所以虽然你的建议在我的情况下有效,但我仍然想了解为什么data.table
的行为在简单的get()
调用和带有赋值的get()
调用之间发生了变化。 - Nils Gudatget
,赋值选项就不再可用了,因为已经返回了一个向量。你可以将一个向量分配给列名,但你不能将一个名称向量分配给另一个向量(除非更加小心)。 - MichaelChirico