2013-04-08 58 views
-2

製作項目隨機數據如何在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 
+1

如果你能解釋一下你試圖用這段代碼實現的目標,那可能會更容易幫助你。 – Simon 2013-04-08 08:40:20

回答

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循環創建快得多。

+0

你有計時嗎?如果有的話,我懷疑這會比for循環快得多。使用矢量化可能是首選。 – 2013-04-08 08:47:22

+0

@RicardoSaporta我應該做一個system.time。幾分鐘 – 2013-04-08 08:48:15

+0

@RicardoSaporta的sapply需要: '用戶系統經過 0.104 0.000 0.106' for循環只是一個有點慢: '用戶系統經過 0.108 0.000 0.110' – 2013-04-08 08:52:24