从较小的data.tables中填充data.table

我正在寻找一种从计算得出的较小data.tables中填充 Result data.table的方法。 我的方法如下:

#CREATE EXAMPLE

library(data.table)

# The empty table to be filled

DT <- data.table(
   "ID" = c("a","b","c","d"),"A" = numeric(4),"B" = numeric(4))

   ID A B
1:  a 0 0
2:  b 0 0
3:  c 0 0
4:  d 0 0

# Table with part of the results
DT_short <- data.table(
         "ID" = c("a","A" = 1:3,"B" = 1:3)

   ID A B
1:  a 1 1
2:  b 2 2
3:  d 3 3

我想做的是根据行和列的名称填充它们。 我设法访问了要更改的大数据表部分。

nm1 <- names(DT_short)
DT[ID %in% DT_short[,ID],..nm1]
#Bonus question: Why do I have to assign nm1 before,how do I make it work directly in []?

现在,我想用小表DT来代替DT_short的这一部分,但是我尝试了一切(例如<-:=或某种{ {1}}无效。例如。 merge的错误object '..nm1' not found

请提供解决方案或向正确的方向指点我。 (由于我正在使用的数据相当小-10 ^ 2列,10 ^ 2行,〜40个要合并的小文件,每个字段个数

编辑

回应罗纳克·沙(Ronak Shah)。当我用下面的代码测试您的解决方案时,它可以很好地工作,没有任何错误/警告。在接受解决方案之前,我想确保它也适用于其他人/知道为什么它会对您而不是我造成警告。

DT[ID %in% DT_short[,..nm1] <- DT_short
jian199 回答:从较小的data.tables中填充data.table

这是一种可能的方法。对于mycols中的每一列,您要分配DT_short中的值。这样做时,您想使用match()并获取索引,并使用它来创建新的向量。创建新的data.table后,您想要将NA替换为0。

library(data.table)

mycols <- names(DT)[2:3]

as.data.table(lapply(mycols,function(x){
    DT_short[match(x = DT$ID,table = DT_short$ID),..x]}))[,(mycols) := replace(x = .SD,list = is.na(.SD),values = 0),.SDcols = mycols][]

#   A B
#1: 1 1
#2: 2 2
#3: 0 0
#4: 3 3
,

另一种选择是使用更新联接:

cols <- setdiff(names(DT_short),"ID")
DT[DT_short,on=.(ID),(cols) := mget(paste0("i.",cols))]
,

由于您提到可以使用其他解决方案,因此通过从较大的子帧中分配较小的数据帧的行和列并分配较短的数据帧,可以轻松地对基本R data.frames进行此部分操作。

df1 <- data.frame(DT)
df2 <- data.frame(DT_short)
df1[match(df2$ID,df1$ID),match(names(df2),names(df1))] <- df2

df1
#  ID A B
#1  a 1 1
#2  b 2 2
#3  c 0 0
#4  d 3 3

我认为用data.table做同样的事情是不正确的,但是如果我们运行上面的代码,它就可以工作(共享示例至少)

DT[match(DT_short$ID,DT$ID),match(names(DT_short),names(DT))] <- DT_short

,但是它返回一条大警告消息,该消息确认这不是data.tables的正确方法。

本文链接:https://www.f2er.com/2748238.html

大家都在问