如何在R中更快,更高效地执行此操作?
制作项目随机数据如何在R中更快,更高效地执行此操作?
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
尝试使用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循环快得多。使用矢量化可能是首选。 – 2013-04-08 08:47:22
@RicardoSaporta我应该做一个system.time。几分钟 – 2013-04-08 08:48:15
@RicardoSaporta的sapply需要: '用户系统经过 0.104 0.000 0.106' for循环只是一个有点慢: '用户系统经过 0.108 0.000 0.110' – 2013-04-08 08:52:24
如果你能解释一下你试图用这段代码实现的目标,那可能会更容易帮助你。 – Simon 2013-04-08 08:40:20