【问题标题】:improving efficiency of R code using combination使用组合提高 R 代码的效率
【发布时间】:2014-04-12 06:48:50
【问题描述】:

我有一个数据

数据:

[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",...

五个值与一对两个的组合以及所有行的 this。

然后我需要将所有这些值绑定到一个向量中,以便最终输出如下所示:

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

如何有效地做到这一点?谢谢

【问题讨论】:

    标签: r performance


    【解决方案1】:

    一线解决方案

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

    根据阿难更新。

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

    【讨论】:

    • 不确定速度的提升,但combn 有一个FUN 参数,允许您将paste 移动到combn 调用本身(从而消除对@987654327 的需要@)。
    • 另外,将fixed = TRUE 添加到strsplit 通常会导致更有效的处理(如果模式是固定的,它似乎就在这里)。
    • 谢谢,我不知道 combn 有一个有趣的参数。 :)
    • 这是经常被忽视的功能之一 :-)
    【解决方案2】:

    我认为粘贴在一起会使结果不太有用,因此构造了一个两列矩阵:

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

    【讨论】:

    • t是矩阵或data.frame转置函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2010-10-27
    • 2012-04-26
    相关资源
    最近更新 更多