使用1-10中的数字创建唯一键

时间:2015-01-21 16:40:28

标签: r

我必须通过从10个数字中选择任意6个数字(可能会改变)来创建不同的组合(1-10) 我有大约210个不同的组合。现在我想使用每个组合中的数字为每个组合创建一个唯一的键。

       V1   V2  V3  V4  V5  V6  V7  V8
        1   1   1   1   1   1   1   1
        2   2   2   2   2   2   2   2
        3   3   3   3   3   3   3   3
        4   4   4   4   4   5   5   5
        5   6   7   8   9   6   7   8
Total   15  16  17  18  19  17  18  19
Key     --   -- --  --  --  --  --  --

我试过了总和..但总和并不是唯一的... 我也尝试将数字转换为二进制,然后取总和。但仍然没有成功 请建议一些简单的方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

从评论中看来,真正的问题是你有两个表,想要从表A中查找和删除与表B中任何行完全匹配的行。换句话说,你想要找到A和B之间的集合差异。

一种方法是使用setdiff功能。 setdiff将所有内容转换为向量,因此我们需要先将输入矩阵转换为列列表。

x<-combn(10,6)
y<-combn(11,6)

## Create a list of columns to use with setdiff
xCols<-lapply(seq_len(ncol(x)), function(i) x[,i])
yCols<-lapply(seq_len(ncol(y)), function(i) y[,i])

## Get the columns from y that aren't in x
diffCols<-setdiff(yCols,xCols)

## Convert back to matrix
matrix(unlist(diffCols),nrow=6)

         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] ...
    [1,]    1    1    1    1    1    1    1    1    1
    [2,]    2    2    2    2    2    2    2    2    2
    [3,]    3    3    3    3    3    3    3    3    3
    [4,]    4    4    4    4    4    4    5    5    5
    [5,]    5    6    7    8    9   10    6    7    8
    [6,]   11   11   11   11   11   11   11   11   11

另一个选项,类似于您尝试做的,是找到连接值之间的差异。但这并不快,因为比较连接字符串并不比比较原始值更快 - 比较必须一次完成一个字符:

## Calculate a key for each column
xCols<-sapply(seq_len(ncol(x)), function(i) paste(x[,i],collapse="-"))
yCols<-sapply(seq_len(ncol(y)), function(i) paste(y[,i],collapse="-"))

## Return only columns that don't have a match
y[,which(match(yCols,xCols,0L)==0,arr.ind=TRUE)]

答案 1 :(得分:0)

我使用2的幂(基数)为每个列创建了一个唯一的键,对应于每个元素并加在一起。

因此对于V1,总数是2 ^ 1 + 2 ^ 2 + 2 ^ 3 + 2 ^ 4 = 30。由于所有列都是唯一的(唯一组合),因此该键是唯一的。所以我为新旧数据创建了两个sum的向量。 旧数据矢量 V1 V2 V3 ...... 126 196 318 ..

新数据向量 V1 V2 V3 ...... 130 196 350 ..

现在使用循环

比较新数据向量
for (i in length(new_listn):1){
           if ((match(new_listn[i], old_list, nomatch = 0))>0){
           comps_comb<-comps_comb[-(i)]
                      }

这里我表示向量中的列和相应的数据帧Comp_comb 基本上,如果来自新数据的密钥与旧数据中的任何密钥匹配,则删除相应的列。 它工作得很好..

感谢大家提出解决方案。我真的很喜欢这个群体.. ......