用替换创建组合

时间:2019-04-18 03:46:16

标签: r data-manipulation

我有一个像下面这样的小例子:

df1 = data.frame(Id1=c(1,2,3))

我想获取所有带有替换的组合的列表,如下所示:

enter image description here

到目前为止,我已经看到了以下函数,这些函数产生了上表的某些部分:

a)组合功能

t(combn(df1$Id1,2)) 

# Does not creates rows 1,4 and 5 in the above image

b)expand.grid功能

expand.grid(df1$Id1,df1$Id1) 

# Duplicates rows 2,3 and 5. In my case the combination 1,2 and 2,1 
#are the same. Hence I do not need both of them at the same time.

c)CJ函数(来自data.table)

#install.packages("data.table")
CJ(df1$Id1,df1$Id1)

#Same problem as the previous function

供您参考,我知道在python中我可以使用itertools包(链接在https://www.hackerrank.com/challenges/itertools-combinations-with-replacement/problem上)进行同样的操作

在R中有办法吗?

1 个答案:

答案 0 :(得分:1)

这是使用expand.grid的替代方法,为每个组合创建唯一的key,然后删除重复项

library(dplyr)

expand.grid(df1$Id1,df1$Id1) %>%
   mutate(key = paste(pmin(Var1, Var2), pmax(Var1, Var2), sep = "-")) %>%
   filter(!duplicated(key)) %>%
   select(-key) %>%
   mutate(row = row_number())


#  Var1 Var2 row
#1    1    1   1
#2    2    1   2
#3    3    1   3
#4    2    2   4
#5    3    2   5
#6    3    3   6