使用组合提高R代码的效率

时间:2014-04-12 06:48:50

标签: r performance

我有数据

数据:

[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

我希望以这样的方式生成这些组合,即形成每行的合并

第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=" "))
 }

如何有效地完成这项工作?谢谢

2 个答案:

答案 0 :(得分:1)

一线解决方案

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

根据阿南达更新。

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

答案 1 :(得分:0)

我认为粘在一起会使结果变得不那么有用,所以构造了一个两列矩阵:

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