2014-04-12 19 views
0

改善的R代码里面效率我有一个数据使用组合

数据:

[1] "146002 1591246 1453825 1976867 318484"                                
[2] "669019 557068 787848 1752826 595490 1370072 32948 1059410 456048 2075616 2151636"                     
[3] "7052 84626 1876916 289198 1925401"                                 
[4] "2074708 609769 2074708 1586598 1750679"                                
[5] "230221 818400 230221 550378 569906 158775 178756"                             
[6] "357215 1000036 45393 

我要生成,对于每个行cobination形成

为这样的方式的这些组合第1行

“146002 1591246”, “146002 145825”, “146002,1976867”, “1591246 1453825”,...

五个值的组合以及一对两个和所有行的这一组合。

然后我需要绑定所有这些价值的载体,从而最终输出的样子:

final output : 
146002 1591246 
146002 145825 
......... 

我做以下,但其采取了大量的时间:

gram_2<-vector() 
for(i in 1:length(data)) 
{ 
    if(length(unlist(strsplit(data[i]," ")))>2){ 
     comb<-combn(unlist(strsplit(data[i]," ")),2) 
     for(j in 1:ncol(comb)) 
     { 
      gram_2<-rbind(gram_2,paste(comb[,j],collapse=" ")) 
     } 
     } 
    gram_2<-rbind(gram_2,paste(data[i],collapse=" ")) 
} 

谢谢

回答

1

单线解决方案

apply(do.call(cbind, lapply(strsplit(data, " "), combn, 2)), 2, paste, collapse=" ") 

根据Ananda更新。

unlist(lapply(strsplit(data, " ", fixed=TRUE), combn, 2, paste, collapse=" ")) 
+1

不知道对速度的提高,但'combn'有一个'FUN'参数,让您将'paste'移入'combn'调用本身(并因此不需要'do.call')。 – A5C1D2H2I1M1N2O1R2T1

+1

另外,在'strsplit'中加入'fixed = TRUE'通常会导致更高效的处理(如果模式是固定的,它看起来在这里)。 – A5C1D2H2I1M1N2O1R2T1

+0

谢谢,我不知道combn有一个有趣的论点。 :) –

0

我想粘贴在一起,会使结果的那么有用构造一个两列的矩阵:

do.call(rbind, sapply(lapply(sapply(vec, strsplit, " "), combn, 2),t)) 
+0

- 什么是“t”在这里? – user3171906

+0

't'是矩阵或数据帧转置函数。 –