R 如何创建具有列名称的空数据表,然后将数据表附加到其中?

R 如何创建具有列名称的空数据表,然后将数据表附加到其中?,r,merge,data.table,R,Merge,Data.table,首先,我想创建一个具有列名的空数据表,但失败了: data <- data.table(va, vb, vc) > Error in data.table(va, vb, vc) : object 'va' not found 数据表(va、vb、vc)中的数据错误:找不到对象“va” 其次,我想将datatable附加到它,但它也失败了: data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1)) data

首先,我想创建一个具有列名的空数据表,但失败了:

data <- data.table(va, vb, vc)

> Error in data.table(va, vb, vc) : object 'va' not found
数据表(va、vb、vc)中的数据错误:找不到对象“va” 其次,我想将datatable附加到它,但它也失败了:

data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
merge(data2,data2)

> Error in merge.data.table(data2, data2) : 
      Can not match keys in x and y to automatically determine appropriate `by` parameter. Please set `by` value explicitly.
merge.data.table中的数据2错误(数据2,数据2): 无法匹配x和y中的键以自动确定适当的`by`参数。请显式设置`by`值。
显然,该函数无法通过两个相同数据表的参数来识别
。有什么想法吗?

创建一个空的
数据。表
使用(假设所有列都是数字):

对所有列执行自联接,请使用(即使结果相同;-):

其结果是:

> data
Empty data.table (0 rows) of 3 cols: va,vb,vc
> data3
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
4: -1 -1 -1
5:  0  0  0
6:  1  1  1

要创建空data.table,可以从空矩阵开始:

library(data.table)
data <- setNames(data.table(matrix(nrow = 0, ncol = 3)), c("va", "vb", "vc"))
data
Empty data.table (0 rows) of 3 cols: va,vb,vc
甚至更简单,以下方法也适用:

data <- data.table()
data <- rbindlist(list(data, data2))
data
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1

data创建具有已定义列名但不必定义数据类型的空data.table的另一种方法:

data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]

找不到“object va”是因为R假设它是一个变量名,并且您的工作区中没有名为
va
的现有变量来创建空数据。表使用(假设所有列都是数值的):
data=data.table(va=numeric(),vb=numeric(),vc=numeric())
在循环中动态增长对象(这听起来像是你在做的)在R中是个坏主意。这个问题已经过时,
merge(data2,data2)
默认为data.table v1.11.x中的所有(共享)键。我猜这在v1.9.6(2016)中没有实现。@tamarad《R地狱》第2章(此处免费)是人们通常指的,它提到的地方“内存碎片化”和缓慢作为副作用。这适用于向量、数组和表。我认为唯一的例外是不断增长的列表是可以的,正如这里的评论所提到的:在1.11.x中,
merge
现在尽可能使用共享键列。“如果省略
merge(…,by),则没有隐含的“使用所有列”语义。”
parameter“不再是真的;我想它在2016年(v1.9.6)时还没有实现。您能更正您的答案吗?应该是公认的答案……这方面有很大的灵活性。。。
library(data.table)
data <- setNames(data.table(matrix(nrow = 0, ncol = 3)), c("va", "vb", "vc"))
data
Empty data.table (0 rows) of 3 cols: va,vb,vc
data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
rbindlist(list(data, data2))
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
data <- data.table()
data <- rbindlist(list(data, data2))
data
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]
data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]