2017-07-19 108 views
0

我想生成幾個隨機數,從正態分佈採樣,得到幾對平均值和標準偏差。 這些對存儲在一個data frame,與含有對所述identifiant三列,平均值和標準偏差如以下示例的值:R,從每個數據幀行創建幾個隨機數

ex <- data.frame("id" = c("id_1_0.1", "id_2_0.5"), "mean" = c(1, 2), "sd" = c(0.1, 0.5)) 

要對於每對創建10張隨機數,我使用了這些兩行:

tmp <- by(cbind(ex$mean, ex$sd), ex$id, function(x) rnorm(10, mean = x[, 1], sd = x[, 2])) 
tmp <- do.call(rbind, lapply(tmp, data.frame, stringsAsFactors = FALSE)) 

我想這樣做是爲了然後合併這兩個數據幀extmp有一個數據幀的所有信息。 使用這種方法,由於增量我面臨命名問題,所以我不能做一個簡單的合併。

我應該嘗試用regex公式解決這個問題還是有更簡單的解決方案?

+0

對不起,在我的答案錯變量引用,不得不臨時變量「A」還是在我的全球環境中。 – Florian

回答

0

此代碼似乎爲你工作:

library(dplyr) 
ex <- data.frame("id" = c("id_1_0.1", "id_2_0.5"), mean = c(1, 2), sd = c(0.1, 0.5)) 

random_list = apply(ex[,c("id","mean","sd")],1,function(x) { 
    data.frame(id=rep(x[1],10), 
      random= rnorm(10, mean = as.numeric(x[2]), sd = as.numeric(x[3])))}) 

ex = do.call(rbind,random_list) %>% left_join(ex) 

希望這有助於!

+0

它的功能完美,訣竅在於複製apply函數中的標識符。謝謝。 –

0

我能夠使用一些正則表達式來刪除您的ID的增量計數器,允許它們與您的原始ID合併。可能有一種更漂亮的方法來做到這一點,但這似乎工作。

# Pull rownames in and delete counter 
tmp$id <- gsub("(.[^.]*$)", "", rownames(tmp)) 

# Merge with original data 
new <- merge(ex, tmp, by = "id") 
head(new) 
#   id mean sd X..i.. 
# 1 id_1_0.1 1 0.1 1.1226943 
# 2 id_1_0.1 1 0.1 1.0666694 
# 3 id_1_0.1 1 0.1 0.8848397 
# 4 id_1_0.1 1 0.1 0.9839212 
# 5 id_1_0.1 1 0.1 0.9027086 
# 6 id_1_0.1 1 0.1 0.9389538 

正則表達式:選擇後跟任意數量的非.字符[^.]*一個.,從末端開始($

+0

它的工作原理,感謝您的'正則表達式'代碼。我驗證了其他答案,因爲它更加集成,但非常感謝。 –