我必须通过从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 -- -- -- -- -- -- -- --
我试过了总和..但总和并不是唯一的... 我也尝试将数字转换为二进制,然后取总和。但仍然没有成功 请建议一些简单的方法来做到这一点。
答案 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 基本上,如果来自新数据的密钥与旧数据中的任何密钥匹配,则删除相应的列。 它工作得很好..
感谢大家提出解决方案。我真的很喜欢这个群体.. ......