Составьте таблицу данных, используя совпадающие значения из двух таблиц данных, используя R

У меня есть два data.tables (a и b) с использованием R, каждый из которых составляет около 10 000 строк. Каждый data.table содержит три столбца x, y и z. Значения z уникальны в каждом data.table. Каждый data.table имеет несколько одинаковых значений x и y. Что мне нужно сделать, так это создать новый data.table (c), который содержит только строки из a, где значения x и y идентичны значениям в b.

Вот пример того, чего мне нужно добиться.

таблица данных a

x    y      z
a    1    100
a    6    120
c    5    234
b    3    567
d    8    645
f    7    487

таблица данных b

x    y     z
a    1    904
b    6    120
c    7    765
e    3    567
d    8    329
a    0    638

И таблица данных c (вновь созданная таблица данных) должна выглядеть так

x    y     z
a    1    100
d    8    645

Я посмотрел здесь (Сопоставление значений между фреймами данных на основе перекрывающихся дат), но это не совсем привело меня туда, где мне нужно было быть.

Вот код для создания примера data.tables.

library(data.table)

x<-c("a","a","c","b","d","f")
y<-c(1,6,5,3,8,7)
z<-c(100,120,234,567,645,487)
a<-data.frame(x,y,z)
rm(x,y,z)

x<-c("a","b","c","e","d","a")
y<-c(1,6,7,3,8,0)
z<-c(904,120,765,567,329,638)
b<-data.frame(x,y,z)

setDT(a)
setDT(b)

Рад принять предложение, в котором используется традиционный data.frames

Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Простой merge сделает это:

merge(a, b, by=c("x","y"))

По умолчанию merge сохраняет только строки из обоих наборов данных, в которых есть совпадения; вы можете изменить это поведение с помощью аргументов all, all.x и all.y, но здесь в этом нет необходимости.

Если вам не нужны значения z из b с данными, сделайте следующее:

merge(a, b[,.(x,y)], by=c("x","y"))

Пытаться:

# Note that they should be different values of z for identical x and y
# The following options assume that you also want to keep this information i.e. z values 
# from a and b for matched columns x and y
dplyr::inner_join(a, b, by = c("x", "y")) # option 1
merge(a, b, by = c("x","y")) # option 2
# option 3 using DT
setkeyv(a, c("x","y"))
setkeyv(b, c("x","y"))
a[b, nomatch = 0]

В качестве альтернативы подход dplyr:

library(dplyr)
c <- a %>% semi_join(b, by = c("x", "y"))

> c
  x y   z
1 a 1 100
2 d 8 645

Другие вопросы по теме