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