如何使用列名创建一个空数据表,然后将数据表附加到它?

Chi*_*Abs 17 merge r data.table

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

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

> Error in data.table(va, vb, vc) : object 'va' not found
Run Code Online (Sandbox Code Playgroud)

data.table(va,vb,vc)中的错误:找不到对象'va'

然后我想将数据表附加到它但它也失败了:

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.
Run Code Online (Sandbox Code Playgroud)

merge.data.table(data2,data2)出错:无法匹配x和y中的键以自动确定适当的by参数.请by明确设置值.

显然,该函数无法识别by具有两个相同数据表的参数.任何的想法 ?

R Y*_*oda 21

要创建一个空的data.table使用(假设所有列都是数字):

library(data.table)    
data <- data.table(va=numeric(), vb=numeric(), vc=numeric())
data
Run Code Online (Sandbox Code Playgroud)

这导致:

> data
Empty data.table (0 rows) of 3 cols: va,vb,vc
Run Code Online (Sandbox Code Playgroud)

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

data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
merge(data2, data2,by=names(data2))
Run Code Online (Sandbox Code Playgroud)

您必须指定data.table参数的原因是以下文档的语义by:

通过:

要合并的x和y中的共享列名称向量.默认为两个表之间的共享键列.如果y没有键列,则默认为x的键.

由于您没有设置任何键,因此不清楚"连接"列以合并数据表.

如果省略merge参数,则没有隐式的"使用所有列"语义.如果您认为这是一个差距,请向by包裹的作者提交更改请求.

要将data.table的所有行附加到您使用的另一rbind行("row bind")而不是merge:

data3 <- rbind(data2, data2)
data3
Run Code Online (Sandbox Code Playgroud)

结果如下:

> 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
Run Code Online (Sandbox Code Playgroud)


Psi*_*dom 16

要创建一个空的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
Run Code Online (Sandbox Code Playgroud)

然后你可以用它rbindlist来附加新的data.table:

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
Run Code Online (Sandbox Code Playgroud)

甚至更简单,以下也有效:

data <- data.table()
data <- rbindlist(list(data, data2))
data
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
Run Code Online (Sandbox Code Playgroud)


mpa*_*pag 6

使用已定义的列名创建空 data.table 但无需定义数据类型的另一种方法:

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

这执行以下操作

  1. data.table(1): 创建一个NULL可以添加列的非data.table
    • V1一行一行。价值1
    • 您可以使用任何值(除了NULL)代替1
  2. [,`:=`(c("va", "vb", "vc"),NA)]: 添加列va, vb,vc
    • 现在有四列(以 开头V1)和一行。价值1,NA,NA,NA
    • 任何非NULL值都可以替换为 NA
  3. [,V1:=NULL]: 删除V1
  4. [.0]: 返回一个空行
    • 您实际上可以使用 [. n ] 其中n是任何整数。

如果你不喜欢黑魔法,[.0]你也可以使用

data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]
Run Code Online (Sandbox Code Playgroud)