将元素追加到R中的现有表

时间:2020-09-15 08:20:56

标签: r merge data.table

我用一列创建了一个data.table。此列代表我可能会获取以下数据的汽车的名称:

mydata <-mtcars[1:10,]
setDT(mydata, keep.rownames = TRUE)
mydataBase <- data.table (rn = mydata$rn,
                           mpg = as.numeric(),
                           cyl = as.numeric(),
                           disp = as.numeric(),
                           hp = as.numeric(),
                           drat = as.numeric(),
                           wt = as.numeric(),
                           qsec = as.numeric(),
                           vs = as.numeric(),
                           am = as.numeric(),
                           gear = as.numeric(),
                           carb = as.numeric())
There were 11 warnings (use warnings() to see them)
mydataBase
                   rn mpg cyl disp hp drat wt qsec vs am gear carb
 1:         Mazda RX4  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 2:     Mazda RX4 Wag  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 3:        Datsun 710  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 4:    Hornet 4 Drive  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 5: Hornet Sportabout  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 6:           Valiant  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 7:        Duster 360  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 8:         Merc 240D  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
 9:          Merc 230  NA  NA   NA NA   NA NA   NA NA NA   NA   NA
10:          Merc 280  NA  NA   NA NA   NA NA   NA NA NA   NA   NA

然后我运行一系列复杂的功能。每次运行此功能的结果都会为我提供有关一辆汽车的信息。我希望将此信息附加到已经存在的表mydataBase

function(){

# complicated calculations

return(car1)

}

每次运行函数时,都会以以下格式保存计算:

car1 <- mydata[2,]
car1
              rn mpg cyl disp  hp drat    wt  qsec vs am gear carb
1: Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

所以我正在寻找一种方法来填充表格,以使rn匹配并且不产生新的列?

理想的结果:

                   rn mpg cyl disp  hp drat    wt  qsec vs am gear carb
 1:        Datsun 710  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 2:        Duster 360  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 3:    Hornet 4 Drive  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 4: Hornet Sportabout  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 5:         Mazda RX4  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 6:     Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
 7:          Merc 230  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 8:         Merc 240D  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
 9:          Merc 280  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
10:           Valiant  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA

该功能会重复多次,从而在每次运行中都会计算出一辆不同的汽车。到该过程结束时,几乎所有汽车都会有可用数据。

我尝试使用合并,但是会创建多余的列。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用match获取要更新的行号,并使用set来更新行。

library(data.table)

mydata <- mtcars[1:10,]
setDT(mydata, keep.rownames = TRUE)
mydataBase <- data.table(rn = mydata$rn,mpg = NA_real_,cyl = NA_real_,
                          disp = NA_real_,hp = NA_real_,drat = NA_real_,
                          wt = NA_real_,qsec = NA_real_,vs = NA_real_,
                          am = NA_real_,gear = NA_real_,carb = NA_real_)

car1 <- mydata[2,]
set(mydataBase, match(car1$rn, mydataBase$rn), 
                names(mydataBase)[-1], as.list(car1[, -1]))

mydataBase

#                   rn mpg cyl disp  hp drat    wt  qsec vs am gear carb
# 1:         Mazda RX4  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 2:     Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
# 3:        Datsun 710  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 4:    Hornet 4 Drive  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 5: Hornet Sportabout  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 6:           Valiant  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 7:        Duster 360  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 8:         Merc 240D  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
# 9:          Merc 230  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
#10:          Merc 280  NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA