【问题标题】:R, creating several random numbers from each data frame rowR,从每个数据框行创建几个随机数
【发布时间】:2017-07-19 17:09:55
【问题描述】:

我想为几对均值和标准差生成几个从正态分布中采样的随机数。 这些对存储在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 公式解决这个问题还是有更简单的解决方案?

【问题讨论】:

  • 对不起,我的答案中引用了错误的变量,临时变量“a”仍在我的全局环境中。

标签: r dataframe


【解决方案1】:

这段代码似乎对你有用:

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)

希望这会有所帮助!

【讨论】:

  • 它工作得很好,诀窍是在应用函数中复制标识符。谢谢。
【解决方案2】:

我能够使用一些正则表达式从您的 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

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

【讨论】:

  • 它有效,感谢您提供regex 代码。我验证了另一个答案,因为它更加集成,但非常感谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2013-10-21
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2023-03-21
相关资源
最近更新 更多