使用列名作为变量创建data.table

时间:2018-02-22 10:38:24

标签: r data.table calculated-columns

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

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)))

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

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

  

evalq表单相当于eval(quote(expr),...)。 eval在将其传递给求值程序之前计算当前作用域中的第一个参数:evalq避免这种情况。

之后,

  

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

您不能将其用作列表的变量名称。我想它只适用于环境层面。

如果您想使用来自colnames的变量名称作为varibale名称,您可以这样做:

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))

使用包rbindlist

中的data.table绑定
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: