Нахождение разницы на основе взаимодействия между двумя векторами - PullRequest
3 голосов
/ 09 апреля 2019

У меня есть два фрейма данных с двумя столбцами, каждый из которых я бы хотел сравнить, и генерировать вывод, который появляется только в первом фрейме данных, который представляет собой разницу взаимодействия двух столбцов при сравнении между фреймами данных.

Я пытался использовать слияние,% в%, взаимодействие, совпадение, и я не могу получить правильный вывод. Я также интенсивно искал на SO и не нашел подобной проблемы.

Ближайший ответ, который я нашел:

newdat <- match(interaction(dfA$colA, dfA$colB), interaction(dfB$colA, dfB$colB))

Но, очевидно, этот код неверен, так как это (если бы работало) дало бы мне что-то общее между фреймами данных, и я хочу разницу между ними (с ошибкой - он генерирует числовой вектор, когда и colA, и B строка).

Пример данных:

#Dataframe A

    colA     colB
    Aspirin  Smith, John
    Aspirin  Doe, Jane
    Atorva   Smith, John
    Simva    Doe, Jane

#Dataframe B
    colA     colB
    Aspirin  Smith, John
    Aspirin  Doe, Jane
    Atorva   Doe, Jane

## GOAL: 

#Dataframe
    colA     colB
    Atorva   Smith, John
    Simva    Doe, Jane

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Мы можем использовать setdiff из пакета dplyr.

library(dplyr)

setdiff(datA, datB)
#     colA        colB
# 1 Atorva Smith, John
# 2  Simva   Doe, Jane

ДАННЫЕ

datA <- read.table(text = "    colA     colB
    Aspirin  'Smith, John'
    Aspirin  'Doe, Jane'
    Atorva   'Smith, John'
    Simva    'Doe, Jane'",
                   header = TRUE, stringsAsFactors = FALSE)

datB <- read.table(text = "    colA     colB
    Aspirin  'Smith, John'
    Aspirin  'Doe, Jane'
    Atorva   'Doe, Jane'",
                   header = TRUE, stringsAsFactors = FALSE)
1 голос
/ 09 апреля 2019

Если вам нужно решение на основе R, легко написать функцию setdiffDF.

setdiffDF <- function(x, y){
  ix <- !duplicated(rbind(y, x))[nrow(y) + 1:nrow(x)]
  x[ix, ]
}


setdiffDF(dfA, dfB)
#    colA        colB
#3 Atorva Smith, John
#4  Simva   Doe, Jane

Данные в формате dput.

dfA <-
structure(list(colA = structure(c(1L, 1L, 2L, 3L), 
.Label = c("Aspirin", "Atorva", "Simva"), class = "factor"), 
colB = structure(c(2L, 1L, 2L, 1L), .Label = c("Doe, Jane", 
"Smith, John"), class = "factor")), class = "data.frame", 
row.names = c(NA, -4L))

dfB <-
structure(list(colA = structure(c(1L, 1L, 2L), 
.Label = c("Aspirin", "Atorva"), class = "factor"), 
colB = structure(c(2L, 1L, 1L), .Label = c("Doe, Jane", 
"Smith, John"), class = "factor")), class = "data.frame", 
row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...