【问题标题】:Create data.table with column names as variable以列名作为变量创建 data.table
【发布时间】:2018-02-22 10:38:24
【问题描述】:

我有这个尴尬的问题,我想了解它为什么不起作用。

test <- rbind(test, data.table(evalq(names(test)[1]) = rep("", 5), 
                               evalq(names(test)[2]) = rep("", 5)))

问题出在这:

data.table(evalq(names(test)[1]) = rep("", 5), 
                                   evalq(names(test)[2]) = rep("", 5)))

我尝试将evalq(names(test)[1]) 替换为eval(names(test)[1]) 或names(test)[1],但没有解决此问题。

奇怪的是,这个版本没有问题:

data.table("var1" = rep("", 5), "var2" = rep("", 5)))

谢谢你的帮助:)

【问题讨论】:

  • 改用setnames
  • 这里有什么尴尬的地方?您是否看到data.frame 的行为有所不同?
  • 问题是我可以像这样创建一个 data.table : data.table("myVar" = ..) 但是如果我让 myVar 存储一个字符,你怎么做像这样 :data.table(myVar = ...) ?
  • 你不能。而且它不是特定于 data.table 的。您可以尝试自己的 data.table 函数

标签: r data.table calculated-columns


【解决方案1】:

names(test)[1] 的使用是错误的,因为您指向的是列名,而您没有提取列名以用作变量。来自?evalq:

evalq 形式等价于eval(quote(expr), ...)。 eval 在将其传递给评估器之前评估当前范围内的第一个参数:evalq 避免了这种情况。

之后,

eval 在envir 指定的环境中计算 expr 参数并返回计算值。

您不能将其用作列表的变量名。我想它只在环境级别起作用。

如果您想将来自 colnames 的信息用作变量名称,您可以这样做:

assign(names(test)[1], rep("", 5))

但它不适用于你的情况,因为它总是与环境有关。

执行这个:

test <- rbind(test, data.table(assign(names(test)[1], rep("", 5)), 
                               assign(names(test)[2], rep("", 5))))

您将遇到错误,但您还将在全局环境中有 2 个变量,称为 names(test)[1] 和 names(test)[2],其中包含 5 次“”。

如果您不手动设置列名,您可以这样做:

一个测试数据框

  test<-data.frame(Date=c("Jan-2002","Feb-2002","Mar-2002","Apr-2002","May-2002","Jun-2002"),
                        "Value"=c(3.1,2.86,3.37,3.8,3.78,3.61))

使用包data.table中的rbindlist进行绑定

test <- rbindlist(list(test, data.frame(cbind(rep("", 5),rep("", 5)))),use.names = F)

输出

test
        Date Value
 1: Jan-2002   3.1
 2: Feb-2002  2.86
 3: Mar-2002  3.37
 4: Apr-2002   3.8
 5: May-2002  3.78
 6: Jun-2002  3.61
 7:               
 8:               
 9:               
10:               
11:               

【讨论】:

  • 我不明白它与问题有什么关系。
  • 是的,我使用 use.names = F 来避免这个问题,但是你有关于为什么我的代码无法创建数据表的答案吗?
  • 加了一点解释,不知道会不会详尽
  • 感谢您的解释。我现在明白 data.table 在对象范围内评估变量。但是,为什么 eval(.., envir = .GlobalEnv) 仍然不起作用?
  • 您指向的是全球环境,这是您一般问题的基础。
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多