добавление элементов в существующую таблицу в R

#r #merge #data.table

#r #слияние #данные.таблица

Вопрос:

Я создал 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
  

Функция повторяется несколько раз, в результате чего при каждом запуске вычисляется другой car. К концу процесса почти все машины будут иметь доступные данные.

Я пытался использовать слияние, но создаются дополнительные столбцы. есть идеи?

Комментарии:

1. Можете ли вы показать код, в котором вы вызываете эту функцию? Вы вызываете это в какой-то форме цикла?

2. функция вызывается многократно, аналогично циклу. Каждый раз, когда вызывается функция, вычисляются значения для car. Моя первоначальная идея заключалась в том, чтобы «заполнить» таблицу MyDatabase внутри функции и использовать «<<-«, чтобы переписать ее в среде, чтобы в следующий раз, когда вызывается функция и вычисляются значения для другого car, их можно было записать в уже существующую таблицу … так что после 7-8 итераций почти все машины имеют значения

3. но я все еще знаю, какие значения не имеют значений, потому что они NA

4. Можете ли вы заполнить все car значения вместе? Или вы должны заполнять их только по одному?

5. я должен заполнить один за другим

Ответ №1:

Мы можем использовать 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