我想生成几个从正态分布中采样的随机数,用于几对均值和标准差。
这些对存储在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))
我想要做的是然后合并两个数据帧ex
和tmp
,以便在一个数据帧中包含所有信息。
使用这种方法,由于增量,我面临着命名问题,因此我无法进行简单的合并。
我应该尝试使用regex
公式解决这个问题,还是有更简单的解决方案?
答案 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
正则表达式:选择一个.
,后跟任意数量的非.
个字符[^.]*
,从结尾开始($
)