【问题标题】:Generate random numbers in each row between 1 and a particular value in a column在每行中生成介于 1 和列中特定值之间的随机数
【发布时间】:2019-04-18 13:07:40
【问题描述】:

我现在被困了很长一段时间,并且对如何实现这一点非常感兴趣。我有一个数据框,我想添加另一列,其中随机数介于 1 和 Amount 列下的该行中的数字之间。我怎样才能做到这一点? 这就是我现在拥有的:

dataframe$newColumn <- sample(1:30, nrow(dataframe), replace = T)

但我不希望它从 1 变为 30,而是将 Amount 列中的数字作为最大值。

【问题讨论】:

    标签: r random sample


    【解决方案1】:

    带有dplyr的Tidyverse解决方案:

    foo <- data.frame(Amount = 1:10)
    foo %>%
      rowwise %>%
      mutate(newColumn = sample(Amount, 1))
    

    【讨论】:

      【解决方案2】:

      使用基础 R,您可以使用 vapply() 迭代 dataframe$Amount,为 dataframe$Amount 中的每个值调用 sample()

      dataframe$newColumn <- vapply(dataframe$Amount, sample, integer(1), size = 1)
      

      这相当于调用

      sample(dataframe$Amount[i], size = 1)
      

      对于dataframe 中的每一行i。请注意,如果sample() 的第一个参数是单个值n,sample(n) 会将其扩展为1:n。

      sample(5)
      ## [1] 5 2 4 1 3
      

      我们在vapply() 中使用integer(1) 作为FUN.VALUE 参数,实质上声明上述每个迭代的输出将是integer。您可以使用 purrr 包中的 map_int() 获得相同的结果:

      dataframe$newColumn <- purrr::map_int(dataframe$Amount, sample, size = 1)
      

      【讨论】:

      • 也许可以解释一下integer(1) 正在做什么(因为vapply() 的使用范围不如应有的那么广泛)?
      • @BenBolker 确定!我同意,vapply() 在不谈论那个论点的情况下感觉有点神奇。我还提到了purrr::map_int()。
      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多