У меня есть два кадра данных с двумя столбцами, каждый из которых я хотел бы сравнить, и генерировать вывод, который появляется только в первом кадре данных, который представляет собой разницу во взаимодействии двух столбцов при сравнении между кадрами данных.
Я пытался использовать слияние, %in%, взаимодействие, сопоставление, и я не могу получить правильный результат. Я также много искал на 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
Спасибо!
Мы можем использовать 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)
Если вам нужно базовое решение 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))
Также в
data.table
,fsetdiff(datA, datB)
илиanti_join(datA, datB)
изdplyr