Я ищу способ заполнить Result data.table из меньших data.tables, которые приходят из расчетов. Мой подход был следующим:
#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", "b", "d"),
"A" = 1:3,
"B" = 1:3)
ID A B
1: a 1 1
2: b 2 2
3: d 3 3
Я хотел бы заполнить строки и столбцы в соответствии с их именем. Мне удалось получить доступ к части большого data.table, которую я хочу изменить на
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
, но все, что я пытался (как <-
или :=
, или что-то вроде merge
) не сработало. Например, ошибка object '..nm1' not found
для DT[ID %in% DT_short[, ID], ..nm1] <- DT_short
Пожалуйста, помогите мне, предоставив решение или указав мне правильное направление. (Поскольку данные, с которыми я работаю, довольно маленькие - 10 ^ 2 столбца, 10 ^ 2 строки, ~ 40 небольших файлов, которые нужно объединить, число <10 ^ 9 на поле - и другие люди будут использовать мой код, читаемость важнее, чем производительность.) </p>
РЕДАКТИРОВАТЬ
В ответ Ронак Шах. Когда я тестирую ваше решение с помощью приведенного ниже кода, оно работает отлично, без каких-либо ошибок / предупреждений. Прежде чем принять решение, я хотел бы убедиться, что оно работает и для других / знаю, почему оно вызывает предупреждения для вас, а не для меня.
library(data.table)
packageVersion('data.table')
#[1] ‘1.12.8’
#the empty table to be filled
DT <- data.table(
"ID" = c("a", "b", "c", "d"),
"A" = numeric(4),
"B" = numeric(4),
"C" = numeric(4)
)
# ID A B C
#1: a 0 0 0
#2: b 0 0 0
#3: c 0 0 0
#4: d 0 0 0
#table with part of the results
DT_short <- data.table(
"ID" = c("a", "b", "d"),
"A" = 1:3,
"B" = 1:3
)
# ID A B
#1: a 1 1
#2: b 2 2
#3: d 3 3
#table with part of the results 2
DT_shorter <- data.table(
"ID" = c("c"),
"A" = 7,
"B" = 70,
"C" = 3.14
)
# ID A B C
#1: c 7 70 3.14
DT[match(DT_short$ID, DT$ID), match(names(DT_short), names(DT))] <- DT_short
DT[match(DT_shorter$ID, DT$ID), match(names(DT_shorter), names(DT))] <- DT_shorter
DT
# ID A B C
#1: a 1 1 0.00
#2: b 2 2 0.00
#3: c 7 70 3.14
#4: d 3 3 0.00