Catesian продукт без повторяющихся пар в R - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть 2 кадра данных, для которых я хочу создать декартово произведение.

Когда я делаю это, как и ожидалось, я получаю совпадающие пары в том смысле, что считаю ноутбук и радио = радио и ноутбук.

 #2 dataframes to produce the cartesian product 
 SaleItems<-data.frame(Appliance=c("Radio", "Laptop", "TV", "Fridge"))
 SaleItems2<-data.frame(Appliance2=c("Radio", "Laptop", "TV", "Fridge"))

 #create cartesian product
 SaleItems3<-merge(SaleItems,SaleItems2)

Я хочу избавиться от соответствияпары, например, комбинация радио и ноутбука появляется только один раз.

У кого-нибудь есть предложения по достижению этой цели?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Для декартовых объединений с merge передайте NULL в с помощью аргумента :

merge(SaleItems, SaleItems2, by=NULL)

Затем, чтобы удалить эквивалентные совпадения и обратные дубликаты, расширьте его с помощью subset:

subset(merge(SaleItems, SaleItems2, by=NULL),
       Appliance <= Appliance2)

А если поля являются факторами:

subset(merge(SaleItems, SaleItems2, by=NULL),
       as.character(Appliance) <= as.character(Appliance2))

#    Appliance Appliance2
# 1      Radio      Radio
# 2     Laptop      Radio
# 4     Fridge      Radio
# 6     Laptop     Laptop
# 8     Fridge     Laptop
# 9      Radio         TV
# 10    Laptop         TV
# 11        TV         TV
# 12    Fridge         TV
# 16    Fridge     Fridge
1 голос
/ 26 сентября 2019

Другой способ в базе R, который также исключает одинаковые совпадения.

f <- outer(SaleItems$Appliance, SaleItems2$Appliance2 , FUN = "paste", sep = ",")
as.data.frame(do.call(rbind, strsplit(f[upper.tri(f)], ",")))

      V1     V2
1  Radio Laptop
2  Radio     TV
3 Laptop     TV
4  Radio Fridge
5 Laptop Fridge
6     TV Fridge

РЕДАКТИРОВАТЬ : Чтобы включить одинаковые совпадения, выполните:

as.data.frame(do.call(rbind, strsplit(f[upper.tri(f, diag = T)], ",")))

       V1     V2
1   Radio  Radio
2   Radio Laptop
3  Laptop Laptop
4   Radio     TV
5  Laptop     TV
6      TV     TV
7   Radio Fridge
8  Laptop Fridge
9      TV Fridge
10 Fridge Fridge
1 голос
/ 26 сентября 2019

Один из способов - переставить значения столбцов в каждой строке в алфавитном порядке, используя pmin / pmax, и выбрать только distinct строки.

library(dplyr)

SaleItems3 %>%
  mutate(app = pmin(Appliance, Appliance2), app1 = pmax(Appliance, Appliance2)) %>%
  dplyr::select(app, app1) %>%
  distinct()

#      app   app1
#1   Radio  Radio
#2  Laptop  Radio
#3   Radio     TV
#4  Fridge  Radio
#5  Laptop Laptop
#6  Laptop     TV
#7  Fridge Laptop
#8      TV     TV
#9  Fridge     TV
#10 Fridge Fridge
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...