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)
使用已定义的列名创建空 data.table 但无需定义数据类型的另一种方法:
data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]
Run Code Online (Sandbox Code Playgroud)
这执行以下操作
data.table(1): 创建一个NULL可以添加列的非data.table
V1一行一行。价值1NULL)代替1[,`:=`(c("va", "vb", "vc"),NA)]: 添加列va, vb,vc
V1)和一行。价值1,NA,NA,NANULL值都可以替换为 NA[,V1:=NULL]: 删除V1列[.0]: 返回一个空行
如果你不喜欢黑魔法,[.0]你也可以使用
data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]
Run Code Online (Sandbox Code Playgroud)