【问题标题】:How can I do this faster and more efficiently in R?我怎样才能在 R 中更快、更有效地做到这一点?
【发布时间】:2013-03-30 06:14:22
【问题描述】:

使物品随机数据

test <- matrix(runif(100, 0, 1), nrow = 20)
nr <- nrow(test)
mat = matrix(sapply(test, rbinom, n = 1, size = 1), nrow = nr)

使名称随机数据

testvec <- cbind( paste( "A", floor( 10 * runif(20, 0, 1) ), sep="" ) )

制作源数据框

dfrmORG <- data.frame( testvec, mat, c( 1:20 ) )
colnames(dfrmORG) <- c( "name", "item1", "item2", "item3", "item4", "item5", "rkey" )

重复名称计数

dfrmName <- as.data.frame( table( dfrmORG$name ) )
nrowUSR <- nrow( dfrmName )

制作目标数据框

finalDFRM <- data.frame( name = character(nrowUSR), item1 = numeric(nrowUSR), item2 = numeric(nrowUSR),
                          item3 = numeric(nrowUSR), item4 = numeric(nrowUSR), item5 = numeric(nrowUSR) )
finalDFRM$name <- dfrmName[,1]

逻辑

system.time({

for( i in ( 1 : nrow( dfrmORG ) ) ) {
    userKEY <- dfrmORG[ i, 1 ]
    finalDFRM[ c( finalDFRM$name == userKEY ), 2:6 ] <- finalDFRM[ c( finalDFRM$name == userKEY ), 2:6 ] * 0.9 + dfrmORG[ i, 2:6 ]
}

})

逻辑太慢了,我怎样才能让它变得更好?

for loop
a <- a*x + b

我需要总和,按名称,项目

result( finalDFRM )                     data( dfrmORG )
name item1 item2 item3 item4 item5      name item1 item2 item3 item4 item5
  A0  1.71 1.539   1.0  0.90   0.0        A0     0     1     0     0     0
  A4  2.71 0.900   1.9  1.71   1.9        A0     1     1     0     0     0
                                          A0     1     0     0     1     0
                                          A0     0     0     1     0     0
                                          A4     1     0     0     1     0
                                          A4     1     1     1     1     1
                                          A4     1     0     1     0     1

【问题讨论】:

  • 如果你能解释一下你想用这个代码序列实现什么,那可能会更容易帮助你。

标签: r loops for-loop dataframe


【解决方案1】:

尝试使用 sapply

sapply(1 : nrow(dfrmORG), function(i){
userKEY <- dfrmORG[ i, 1 ]
finalDFRM[ c( finalDFRM$name == userKEY ), 2:6 ] <- finalDFRM[ c( finalDFRM$name ==    userKEY ), 2:6 ] * 0.9 + dfrmORG[ i, 2:6 ]
})

这通常比创建 for 循环快很多。

【讨论】:

  • 你计时了吗?我怀疑这会比 for 循环快得多,如果有的话。使用矢量化可能是首选。
  • @RicardoSaporta 我会做一个 system.time。几分钟
  • @RicardoSaporta sapply 需要:user system elapsed 0.104 0.000 0.106 for 循环只是有点慢:user system elapsed 0.108 0.000 0.110
  • 您可能对 rbenchmarkmicrobenchmark 软件包感兴趣;)
  • @RicardoSaporta 我会看看那些包:0 谢谢你的提示!
猜你喜欢
  • 2020-08-01
  • 2022-11-09
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多