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

Create data.table with column names as variable

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

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

我试图用 eval(names(test)[1])names(test)[1] 替换 evalq(names(test)[1]) 但没有解决这个问题。

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

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

谢谢你的帮助:)

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

The evalq form is equivalent to eval(quote(expr), ...). eval evaluates its first argument in the current scope before passing it to the evaluator: evalq avoids this.

之后,

eval evaluates the expr argument in the environment specified by envir and returns the computed value.

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

如果您想将来自 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 次。

如果你不知道手动设置colnames,你可以这样做:

一个测试数据帧

  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: