我有一个像下面这样的小例子:
df1 = data.frame(Id1=c(1,2,3))
我想获取所有带有替换的组合的列表,如下所示:
到目前为止,我已经看到了以下函数,这些函数产生了上表的某些部分:
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中有办法吗?
答案 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