data.table何时确切保留列名?

时间:2018-12-12 15:06:25

标签: r data.table

某些J表达式保留列名,而有些则不:

library(data.table)
d = data.table(hello = 1)
d[, .(hello)]
#    hello
# 1:     1
d[, c(.(hello))]
#    V1
# 1:  1
d[, {.(hello)}]
#    hello
# 1:     1
d[, {1; .(hello)}]
#    V1
# 1:  1
d[, .(get("hello"))]
#    V1
# 1:  1
d[, mget("hello")]
#    hello
# 1:     1
d[, c(mget("hello"))]
# Error: value for ‘hello’ not found  # WTF?
d[, {1; mget("hello")}]
#    hello
# 1:     1

一般规则是什么?

1 个答案:

答案 0 :(得分:6)

这确实不是很神秘。首先请注意,.listdata.table的简写。考虑到这一点,这就是正在发生的事情。

除了mget会吐出一个命名列表之外,您拥有的每个单个表达式都会生成一个未命名列表或向量。这就是mget示例命名结果的原因。在所有其他示例中,data.table仅以非常简单的表达式来推导名称,该表达式等效于list(items)。在另外几种情况下,您会得到涉及.SD的名称推论,但总的来说-如果您不命名(如mget那样),并且比{{1 }},那么不要指望名字的减少。