一个data.table格式,相对两列数据进行计算,得到一列新的数据,结果一直得不到理想的结果。想知道如何解决?
数据:
- n = 3
- ID = paste0("SNP",1:n)
- value = NULL
- for(i in 1:n){
- value[i]= paste(sample(1:20,10),collapse = ";")
- }
- dd = data.frame(ID=ID,value=value)
- idA = rep(ID,n)
- idB = rep(ID,each=n)
- valueA = rep(value,n)
- valueB = rep(value,each=n)
- ddx = data.frame(idA=idA,idB=idB,valueA=as.character(valueA),valueB=as.character(valueB))
- ddy = as.data.table(ddx)
- ddy$valueA = as.character(ddy$valueA)
- ddy$valueB = as.character(ddy$valueB)
- ddy
- > ddy
- idA idB valueA valueB
- 1: SNP1 SNP1 6;15;8;16;17;1;18;12;7;20 6;15;8;16;17;1;18;12;7;20
- 2: SNP2 SNP1 20;9;13;10;2;14;4;1;15;11 6;15;8;16;17;1;18;12;7;20
- 3: SNP3 SNP1 18;14;12;17;11;16;8;19;4;2 6;15;8;16;17;1;18;12;7;20
- 4: SNP1 SNP2 6;15;8;16;17;1;18;12;7;20 20;9;13;10;2;14;4;1;15;11
- 5: SNP2 SNP2 20;9;13;10;2;14;4;1;15;11 20;9;13;10;2;14;4;1;15;11
- 6: SNP3 SNP2 18;14;12;17;11;16;8;19;4;2 20;9;13;10;2;14;4;1;15;11
- 7: SNP1 SNP3 6;15;8;16;17;1;18;12;7;20 18;14;12;17;11;16;8;19;4;2
- 8: SNP2 SNP3 20;9;13;10;2;14;4;1;15;11 18;14;12;17;11;16;8;19;4;2
想看以下valueA和valueB的交集的个数:
我的思路是,直接在data.table中生成一列V5,怀疑因为valueA和valueB涉及到分隔符计算,没有成功,我的代码:
- ddy[,V5:=length(intersect(strsplit(valueA,";"),strsplit(valueB,";")))]
- ddy
- > ddy
- idA idB valueA valueB V5
- 1: SNP1 SNP1 6;15;8;16;17;1;18;12;7;20 6;15;8;16;17;1;18;12;7;20 3
- 2: SNP2 SNP1 20;9;13;10;2;14;4;1;15;11 6;15;8;16;17;1;18;12;7;20 3
- 3: SNP3 SNP1 18;14;12;17;11;16;8;19;4;2 6;15;8;16;17;1;18;12;7;20 3
- 4: SNP1 SNP2 6;15;8;16;17;1;18;12;7;20 20;9;13;10;2;14;4;1;15;11 3
- 5: SNP2 SNP2 20;9;13;10;2;14;4;1;15;11 20;9;13;10;2;14;4;1;15;11 3
- 6: SNP3 SNP2 18;14;12;17;11;16;8;19;4;2 20;9;13;10;2;14;4;1;15;11 3
- 7: SNP1 SNP3 6;15;8;16;17;1;18;12;7;20 18;14;12;17;11;16;8;19;4;2 3
- 8: SNP2 SNP3 20;9;13;10;2;14;4;1;15;11 18;14;12;17;11;16;8;19;4;2 3
- 9: SNP3 SNP3 18;14;12;17;11;16;8;19;4;2 18;14;12;17;11;16;8;19;4;2 3
正确的做法,是写一个循环,但是数据量大的话,速度很慢:
- nn = dim(ddy)[1]
- re=NULL
- system.time({
- for(i in 1:nn){
- # i=3
- re[i]= length(intersect(unlist(strsplit(ddy$valueA[i],";")),unlist(strsplit(ddy$valueB[i],";"))))
- }
- })
- re
- [1] 10 5 5 5 10 8 5 8 10
我想使用apply解决,但是没有想到如何解决,十分感谢。


雷达卡




京公网安备 11010802022788号







