アイテムをランダムデータにする
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
I need sum, by name, items
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