【问题标题】:Assign a variable column name in data.table在 data.table 中分配一个变量列名
【发布时间】:2020-09-10 19:10:19
【问题描述】:

我想做以下事情:

library(data.table)
dt <- data.table(Test = c(1:100))
var <- "TestPlusOne"

#METHOD 1
dt[, (var) := Test + 1][, c("TestPlusOne")]

#METHOD 2
dt[, .(TestPlusOne = Test + 1)]

我想做我在#METHOD 2 中所做的事情,但是使用变量TestPlusOne,即我想在定义名称的变量var 中传递一个列名。在第一个#METHOD 1 中,实际数据表发生了变化,但这是我想防止的副作用。

是否可以更改#METHOD 2 使得列名由var 中的字符串给出?

补充信息:我确实想在dt中添加另一列,也不想深拷贝对象dt来实现它,因为它似乎相当低效。我想在#METHOD 2 做。但我似乎无法确定如何做到这一点。

【问题讨论】:

  • 这已经可以了,对吧? dt[, (var) := Test + 1]你在找什么?
  • 或者您想同时更改数据和列名吗?我建议使用setnames 通过引用更改列名。
  • 是的,这已经可以了,但问题是分配:= 改变了dt。所以对象 dt 被改变了,我不想这样。

标签: r data.table


【解决方案1】:

一种方法是使用setNames()

dt[, setNames(.(Test + 1), var)]

也可以使用这种子集+链接技巧,尽管它可能超出了目的。

dt[TRUE][, (var) := Test + 1][, "TestPlusOne"]
# or as nicola suggests
copy(dt)[, (var) := Test + 1][, "TestPlusOne"] 

一种可能性

setnames(data.table(dt$Test + 1), var)[]

导致

dt[, setnames(data.table(Test + 1), var)]

【讨论】:

  • 我建议使用更清洁的(并且可能更高效)copy(dt),而不是 dt[TRUE]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2013-09-14
  • 2020-04-13
  • 2023-02-03
  • 1970-01-01
相关资源
最近更新 更多