Пакетdata.table
содержит множество одинаковых таблиц. методы обработки как SQL. Если у таблицы есть ключ, этот ключ состоит из одного или нескольких столбцов. Но таблица не может иметь более одного ключа, потому что она не может быть отсортирована двумя разными способами одновременно.
В этом примере X
и Y
— это data.table
с одним ключевым столбцом «id», Y
также имеет неключевой столбец "x_id".
X <- data.table(id = 1:5, a=4:8,key="id")
Y <- data.table(id = c(1,1, 3,5,7), x_id=c(1,4:1), key="id")
Следующий синтаксис wo uld соединяет таблицы по их ключам:
X[Y]
Как преобразовать следующий синтаксис SQL в код data.table?
select * from X join Y on X.id = Y.x_id;
Самое близкое, что я получил, это:
Y[X,list(id, x_id),by = x_id,nomatch=0]
Однако это не делает то же самое внутреннее соединение, что и оператор SQL.
Вот более наглядный пример, в котором внешний ключ — y_id, и мы хотим, чтобы соединение искало значения Y2, где X2$y_id = Y2$id
.
X2 <- data.table(id = 1:5, y_id = c(1,1,2,2,2), key="id")
Y2 <- data.table(id = 1:5, b = letters[1:5], key="id")
Я хотел бы создать таблицу:
id y_id b
1 1 "a"
2 1 "a"
3 2 "b"
4 2 "b"
5 2 "b"
аналогичную тому, что делается с помощью следующего кладжа:
> merge(data.frame(X2), data.frame(Y2), by.x = "y_id", by.y = "id")
y_id id b
1 1 1 a
2 1 2 a
3 2 3 b
4 2 4 b
5 2 5 b
Однако, когда я делаю это:
X2[Y2, 1:2,by = y_id]
Я не получаю желаемого результата:
y_id V1
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2