#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