эффективно добавить одну длину таблицы data.table в соответствии с другим условием таблицы, сопоставив соответствующий столбец - PullRequest
1 голос
/ 06 мая 2020

У меня есть два объекта data.table:

dt <- data.table(
  a = c(1, 1, 2), 
  s = c(1, 2, 5), 
  o = c("A", "A", "A")
)

dt2 <- data.table(
  a = c(1, 1, 2, 2),
  g = c(1, 2, 3, 4)  
)  

Есть два элемента g для каждого a in dt2 . Я хочу сопоставить a in dt с a in dt2 . Тогда в dt каждая строка будет дублироваться 2 раза (потому что есть 2 элемента для каждого a в dt2 . Конечно, это может быть разное количество элементов для каждый a in dt2 . Это означает, что условие в dt2 определяет, как я добавляю соответствующие g из dt2 в dt ) и добавьте соответствующий g из dt2 в последний столбец dt . Итоговая таблица должна быть такой:

fnl <- data.table(
  a = c(1, 1, 1, 1, 2, 2), 
  s = c(1, 1, 2, 2, 5, 5), 
  o = c("A", "A", "A", "A", "A", "A"),
  g = c(1, 2, 1, 2, 3, 4)
)

Для ясности, вот две таблицы ввода и одна таблица вывода.

> dt
   a s o
1: 1 1 A
2: 1 2 A
3: 2 5 A
> dt2
   a g
1: 1 1
2: 1 2
3: 2 3
4: 2 4
> fnl
   a s o g
1: 1 1 A 1
2: 1 1 A 2
3: 1 2 A 1
4: 1 2 A 2
5: 2 5 A 3
6: 2 5 A 4

Я знаю, что при использовании for-l oop Я могу выполнить задачу, но мои данные слишком велики, не могли бы вы выяснить, как это эффективно сделать?

1 Ответ

2 голосов
/ 06 мая 2020

Поскольку вы используете data.tables, это довольно просто:

dt[dt2, on='a']

дает вам

> dt[dt2, on='a']
   a s o g
1: 1 1 A 1
2: 1 2 A 1
3: 1 1 A 2
4: 1 2 A 2
5: 2 5 A 3
6: 2 5 A 4
...