-2

使项目随机数据

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
4

1 回答 1

0

尝试使用 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 循环要快得多。

于 2013-04-08T08:44:30.693 回答