Как слить? или заполнить? данные по ключу с соотношением в r data.table

У меня есть два data.table

 Table A
     ID        DATE   TYPE
 1:  36111468       0    A
 2:  93908095       0    A
 3:  68889156       0    B
 4:  94391053       0    B
 5:  66486300       0    C
 6:  48316003       0    C
 7:  30945034       0    C
 8:  93530960       0    C
 9:  50298782       0    D
10:  61124841       0    D
11:  73185741       0    D
12:  61584842       0    D  
13:  65174431       0    D
14:  69089847       0    D
15:  31180801       0    E
16:  41084849       0    E


TABLE B
    ID       DATE  TYPE 
1:  30341961 20031124 A
2:  53682621 20041023 B
3:  43370733 20040119 C
4:  61728911 20040909 C
5:  79482564 20020107 D  
6:  81995262 20040609 D 
7:  23256429 20021029 D
8:  84849044 20020401 E   

Я хочу заполнить ДАТУ в Таблице А (теперь 0) ключом ДАТА в Таблице В по ТИПУ в соотношении 1:2.

и привязать две таблицы, как это

     ID        DATE   TYPE
 1:  36111468 20031124 A
 2:  93908095 20031124 A
 3:  68889156 20041023 B
 4:  94391053 20041023 B
 5:  66486300 20040119 C
 6:  48316003 20040119 C
 7:  30945034 20040909 C
 8:  93530960 20040909 C
 9:  50298782 20020107 D
10:  61124841 20020107 D
11:  73185741 20040609 D
12:  61584842 20040609 D  
13:  65174431 20021029 D
14:  69089847 20021029 D
15:  31180801 20020401 E
16:  41084849 20020401 E
17:  30341961 20031124 A
18:  53682621 20041023 B
19:  43370733 20040119 C
20:  61728911 20040909 C
21:  79482564 20020107 D  
22:  81995262 20040609 D 
23:  23256429 20021029 D
24:  84849044 20020401 E   

Я предпочитаю data.table, а не dplyr. Если возможно, опишите его как data.table.

2 ответа

Вы можете создавать индексы, прежде чем присоединиться к ним следующим образом:

#same index for every pair of the same TYPE
dtA[, IDX := rep(seq_len(.N/2), each=2), by=TYPE]

#an index for each row within a particular TYPE
dtB[, IDX := seq_len(.N), by=TYPE]

#perform a lookup
dtA[dtB, DATE := i.DATE , on=.(TYPE, IDX)]

#rbind 2 tables
rbindlist(list(dtA, dtB), use.names=TRUE)

данные:

library(data.table)
dtA <- fread("ID        DATE   TYPE
36111468       0    A
93908095       0    A
68889156       0    B
94391053       0    B
66486300       0    C
48316003       0    C
30945034       0    C
93530960       0    C
50298782       0    D
61124841       0    D
73185741       0    D
61584842       0    D  
65174431       0    D
69089847       0    D
31180801       0    E
41084849       0    E")

dtB <- fread("ID       DATE  TYPE 
30341961 20031124 A
53682621 20041023 B
43370733 20040119 C
61728911 20040909 C
79482564 20020107 D  
81995262 20040609 D 
23256429 20021029 D
84849044 20020401 E")

Если таблицы A а также B уже data.tableс, то вы можете просто сделать:

df <- merge(A[,-'DATE'], B[,-'ID'], by = 'TYPE', allow.cartesian = TRUE)
setcolorder(df, c('ID', 'DATE', 'TYPE'))
df
Другие вопросы по тегам