【发布时间】:2015-08-14 06:27:58
【问题描述】:
对于一个很明显我通常在 Python/pandas 中工作的问题,我深表歉意,但我一直坚持这一点。如何使用字符串选择data.table 列?
dt$"string"
dt$as.name("string")
dt$get("string")
我确信这非常简单,但我不明白。非常感谢任何帮助!
------------- 已编辑添加 ----------
在下面的一些有用的 cmets 和提示之后,我想我已经缩小了问题的范围,并有了一个可重现的例子。考虑:
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"应该可以正常工作,到底是什么错误?尽管$的 RHS 表达式永远不会起作用,请参阅 this faq -
你说得有道理——我想我在循环内构造字符串时遇到了错误,所以使用了
$paste(x,y)之类的东西,然后在提问之前忘记尝试不使用表达式! -
尚不清楚为什么
dt[,"col1":=get("col2")]选项不足以满足您的目的,例如for (ii in 1:2) dt[,paste0("col",ii):=get("col2")]似乎是你想要的。也许您需要稍微扩大示例的范围。 -
点了 - 你提到的选项会起作用(这就是我要做的)。出现问题是因为我首先存储了构造的字符串,因为我也在其他地方使用它。如果我再做
var<-paste0("col","1"),我将不得不再次依赖get()方法,这是行不通的。因此,尽管您的建议在我的情况下有效,但我仍然想了解为什么data.table的行为会在简单的get()调用和带有分配的get()调用之间发生变化。 -
@Nilsgudat 这是一个公平的问题。我不在电脑前,但我的直觉告诉我,一旦你使用
get,分配选项就不再可用,因为已经返回了一个向量。您可以将向量分配给列名,但不能将名称向量分配给向量(不加小心)
标签: r string indexing data.table