R,从每个数据帧行创建几个随机数

时间:2017-07-19 17:09:55

标签: r dataframe

我想生成几个从正态分布中采样的随机数,用于几对均值和标准差。 这些对存储在data frame中,其中三列包含对的标识符,均值和标准差的值,如下例所示:

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公式解决这个问题,还是有更简单的解决方案?

2 个答案:

答案 0 :(得分: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)

希望这有帮助!

答案 1 :(得分: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

正则表达式:选择一个.,后跟任意数量的非.个字符[^.]*,从结尾开始($