首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中无重复对的Catesian积

R中无重复对的Catesian积
EN

Stack Overflow用户
提问于 2019-09-26 11:32:41
回答 3查看 213关注 0票数 2

我有两个数据文件,我想为它创建一个笛卡儿积。

当我这样做时,正如我所期望的那样,我得到匹配的对,就像我考虑膝上型计算机和无线电=收音机和膝上型计算机。

代码语言:javascript
运行
复制
 #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)

我想要的是摆脱匹配的配对,例如,收音机和笔记本电脑的组合只出现一次。

有人有什么建议来达到这个目的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-26 12:46:40

对于带有merge的笛卡尔联接,通过参数将NULL传递到:

代码语言:javascript
运行
复制
merge(SaleItems, SaleItems2, by=NULL)

然后,若要删除等效匹配并反向重复,请使用subset扩展它。

代码语言:javascript
运行
复制
subset(merge(SaleItems, SaleItems2, by=NULL),
       Appliance <= Appliance2)

如果字段是因素:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-09-26 11:40:31

一种方法是使用pmin/pmax按字母顺序重新排列每一行中的列值,并只选择distinct行。

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-09-26 12:30:41

另一种方式在基本R,也排除相同-相同的匹配。

代码语言:javascript
运行
复制
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

编辑:若要包含相同的匹配,请执行以下操作:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58115917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档