Как слить? или заполнить? данные по ключу с соотношением в 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