2017-07-19 112 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

它的工作原理,感谢您的'正则表达式'代码。我验证了其他答案,因为它更加集成,但非常感谢。 –