将数据从一个data.table填充到另一个

时间:2015-09-16 14:16:05

标签: r matrix data.table

我有一个距离矩阵(作为data.table),显示了多个项目之间的成对距离,但并非所有项目都在矩阵中。我需要创建一个更大的data.table,其中包含所有缺少的项目。我可以很容易地用矩阵做到这一点:

items=c("a", "b", "c", "d")
small_matrix=matrix(c(0, 1, 2, 3), nrow=2, ncol=2, 
      dimnames=list(c("a", "b"), c("a", "b")))

# create zero matrix of the right size
full_matrix <- matrix(0, ncol=length(items), nrow=length(items),
      dimnames=list(items, items))

# populate items from the small matrix
full_matrix[rownames(small_matrix), colnames(small_matrix)] <- small_matrix
full_matrix
#   a b c d
# a 0 2 0 0
# b 1 3 0 0
# c 0 0 0 0
# d 0 0 0 0

data.table中的等价物是什么?我可以创建一个&#39; id&#39; small_DT中的列并将其用作键,但我不确定如何覆盖full_DT中具有相同内容/列对的项目。

2 个答案:

答案 0 :(得分:4)

让我们转换为data.table并将行名称保留为额外列:

dts = as.data.table(small_matrix, keep = T)
#   rn a b
#1:  a 0 2
#2:  b 1 3
dtf = as.data.table(full_matrix, keep = T)
#   rn a b c d
#1:  a 0 0 0 0
#2:  b 0 0 0 0
#3:  c 0 0 0 0
#4:  d 0 0 0 0

现在只需加入行,并假设小矩阵始终是子集,您可以执行以下操作:

dtf[dts, names(dts) := dts, on = 'rn']
dtf
#   rn a b c d
#1:  a 0 2 0 0
#2:  b 1 3 0 0
#3:  c 0 0 0 0
#4:  d 0 0 0 0

以上假设版本为1.9.5+。否则,您需要先设置密钥。

答案 1 :(得分:2)

假设您有这两个data.table

dt1 = as.data.table(small_matrix)

#   a b
#1: 0 2
#2: 1 3

dt2 = as.data.table(full_matrix)

#   a b c d
#1: 0 0 0 0
#2: 0 0 0 0
#3: 0 0 0 0
#4: 0 0 0 0

您无法像data.framematrix一样操作,例如:

dt2[rownames(full_matrix) %in% rownames(small_matrix), names(dt1), with=F] <- dt1

此代码会引发错误,因为要影响新值,您需要使用:=运算符:

dt2[rownames(full_matrix) %in% rownames(small_matrix), names(dt1):=dt1][]

#   a b c d
#1: 0 2 0 0
#2: 1 3 0 0
#3: 0 0 0 0
#4: 0 0 0 0