【问题标题】:5 letters "word" randomly generated5个字母“word”随机生成
【发布时间】:2015-02-23 13:52:27
【问题描述】:

我想创建一个由 5 个随机生成的字符组成的 10 个“单词”的向量。例如 c("ASDT","WUIW"...)

目前我正在使用以下脚本,但肯定应该有更好的方法来做到这一点

result = list()
for (i in 1:10){
result[i]<-paste(sample(LETTERS, 5, replace=TRUE),collapse="")
}
result<-paste(t(result))

【问题讨论】:

    标签: r random-sample


    【解决方案1】:

    我会采样一次并将结果转换为data.frame,可以传递给paste0

    set.seed(42)
    do.call(paste0, as.data.frame(matrix(sample(LETTERS, 50, TRUE), ncol = 5)))
    #[1] "XLXTJ" "YSDVL" "HYZKA" "VGYRZ" "QMCAL" "NYNVY" "TZKAX" "DDXFQ" "RMLXZ" "SOVPQ"
    

    【讨论】:

    • 我不得不说我觉得这个解决方案太晦涩难懂(又名“聪明”,这在编程中不是通常是一件好事),因此不如显而易见的解决方案 OP 已发布。
    • @KonradRudolph OP 发布的是许多语言的明显解决方案,但不是 R。
    • @Roland 很明显,我认为 my 代码是显而易见的解决方案,并且我避开了显式循环。但我发现很难说您的解决方案更明显,即使在 R 中也是如此,并且带有循环的解决方案本质上只是在做 replicate 解决方案所做的事情。
    • 这是我的小改动,作为一个两班。 m &lt;- matrix(sample(LETTERS, 50, TRUE), ncol = 5); apply(m,1,paste0,collapse="") 或者你可以使用%&gt;%
    • @BenBolker 我不这么认为,因为我很确定 Roland 正在尝试矢量化他的解决方案......
    【解决方案2】:

    您的代码基本上没有任何问题,可能只是因为它使用了循环。

    唯一更好的方法是用列表应用程序函数替换循环(在本例中:replicate):

    replicate(10, paste(sample(LETTERS, 5, replace = TRUE), collapse = ''))
    

    【讨论】:

    • sapply是一个for循环,是replicate的源代码
    • @David 同样,我在我的代码中看不到循环。它是如何实现的并不重要。实现的是必须写的代码。
    • 这样的循环已经过优化,旨在运行得更快,这就是为什么我们仍然可以使用它们。一个简单的 for 循环比标准的 R 函数慢。
    • @naltipar 你错了。 for 循环不会比 replicate 慢,前提是您预先分配了结果对象,而 OP 没有这样做。
    • @naltipar 如果该函数在 library 代码中,当然可以。重申一下:重要的是 必须编写的代码,而不是我正在调用的代码。这被称为“abstraction”,它在编程中绝对是至关重要的概念。没有它,我们就无法编写高级代码——根据定义,所有代码都是低级的。不,我的帖子中绝对没有任何误导。它直接遵循第一原则。
    【解决方案3】:

    我会创建一个自定义函数,例如这个函数,它将接受一个单词的大小和你想要的单词数作为回报

    WordsGen  <- function(n, size){
      substring(paste(sample(LETTERS, n * size, replace = TRUE), collapse = ""),
                 seq(1, (n - 1)*size + 1, size), seq(size, n * size, size))
    }
    
    set.seed(1)
    WordsGen(10, 5)
    ## [1] "GJOXF" "XYRQB" "FERJU" "MSZJU" "YFQDG" "KAJWI" "MPMEV" "RUCSK" "VQUON" "UAMTS"
    

    【讨论】:

      【解决方案4】:

      这是stringi的一个选项

      library(stringi)
      set.seed(1)
      stri_rand_strings(10, 5, '[A-Z]')
      #[1] "GJOXF" "XYRQB" "FERJU" "MSZJU" "YFQDG" "KAJWI" "MPMEV" "RUCSK" "VQUON"
      #[10] "UAMTS"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 2011-07-23
        • 2021-09-23
        • 2014-12-15
        • 1970-01-01
        相关资源
        最近更新 更多