【问题标题】:Create a randomised list of element using a vector with 4 words使用包含 4 个单词的向量创建元素的随机列表
【发布时间】:2021-09-09 12:00:52
【问题描述】:

我有一个包含 4 个单词的向量:

v <- c("pevilo", "tufimi", "patoji", "nasola") 

我想创建一个列表,每个元素重复 24 次,但有 2 个条件:

  • cond 1:没有一个元素可以连续重复两次(例如:Cha , Cha
  • cond 2 : 同一对元素不能连续重复两次(例如:Cha, Adri, Cha, Adri

我已经尝试在 r 中使用此代码:

v <-  c("pevilo","tufimi","patoji","nasola")
list2 <-  replicate(32, sample(v, 4, replace = FALSE))

但是我有 32 个不同的向量,有时会违反这 2 个条件。

关于如何使用 r 完成此任务的任何想法?或者有人有类似的代码吗?

【问题讨论】:

  • 请详细说明create a list that repeats 24 times each element, 的含义
  • v -&gt; c("pevilo", "tufimi", "patoji", "nasola") 是无效的 R 代码并给出错误。您还提供了一个示例向量c("pevilo", "tufimi", "patoji", "nasola"),然后用Adri, Cha, 提供了一个令人困惑的解释。您能否为您共享的数据提供预期的输出?
  • @RonakShah 已编辑,Q 很清楚,“cha, cha”, “cha, adri” 只是一个例子,用向量 v 中 4 个单词中的任意 2 个替换它。

标签: r list vector combinations


【解决方案1】:
library(tidyverse)

v <- c("pevilo", "tufimi", "patoji", "nasola")

cond1_regex <-
  expand_grid(a = v) %>%
  mutate(b = a) %>%
  unite(u,  sep = ",") %>%
  pull(u) %>%
  paste(collapse = "|") %>%
  paste0("(", ., ")")

cond1_regex
#> [1] "(pevilo,pevilo|tufimi,tufimi|patoji,patoji|nasola,nasola)"

cond2_regex <-
  expand_grid(a = v, b = v) %>%
  mutate(c = a, d = b) %>%
  unite(u,  sep = ",") %>%
  pull(u) %>%
  paste(collapse = "|") %>%
  paste0("(", ., ")")

cond2_regex
#> [1] "(pevilo,pevilo,pevilo,pevilo|pevilo,tufimi,pevilo,tufimi|pevilo,patoji,pevilo,patoji|pevilo,nasola,pevilo,nasola|tufimi,pevilo,tufimi,pevilo|tufimi,tufimi,tufimi,tufimi|tufimi,patoji,tufimi,patoji|tufimi,nasola,tufimi,nasola|patoji,pevilo,patoji,pevilo|patoji,tufimi,patoji,tufimi|patoji,patoji,patoji,patoji|patoji,nasola,patoji,nasola|nasola,pevilo,nasola,pevilo|nasola,tufimi,nasola,tufimi|nasola,patoji,nasola,patoji|nasola,nasola,nasola,nasola)"

v %>%
  rep(24) %>%
  paste0(collapse = ",") %>%
  str_remove_all(cond1_regex) %>%
  str_remove_all(cond2_regex) %>%
  str_split(",") %>%
  purrr::simplify()
#>  [1] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#>  [9] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [17] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [25] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [33] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [41] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [49] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [57] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [65] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [73] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [81] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"
#> [89] "pevilo" "tufimi" "patoji" "nasola" "pevilo" "tufimi" "patoji" "nasola"

reprex package (v2.0.1) 于 2021-09-09 创建

【讨论】:

    【解决方案2】:

    我不确定如何使其在强制相等的 1、2、3 和 4 的情况下工作。为了实现这一点,您需要某种算法来尝试许多不同的迭代,因为大多数迭代最终都会运行列表末尾的数字不足(例如只有 4 剩余可填写但不符合条件,迫使您重新开始)。除此以外,我想出了一些可以满足您要求的方法。

    vector <- c(1:4)
    
    list2 <- list()
    for (i in 1:(24*length(vector))) {
      lv1 <- max(unlist(list2[i-1]),0)
      lv2 <- max(unlist(list2[max(i-2, 0)]),0)
      lv3 <- max(unlist(list2[max(i-3, 0)]),0)
      if (lv3 == lv1 & lv1 != 0) {
        lv <- sample(setdiff(vector,c(lv2, lv1)), 1)
      } else {
        lv <- sample(setdiff(vector, lv1), 1)
      }
      list2 <- append(list2, lv)
    } 
    

    循环的作用是检查列表中的每个新值之前的值是什么。接下来,它检查返回的值 3 项是否与最后一个值相同,如果是,则新值不能相同并且返回的 2 项。在任何一种情况下,新值都不能与上一个值相同。我们通过使用setdiff

    来实现这一点

    但是当我们检查事件时你会发现它有它的局限性:

    library(dplyr)
    as.data.frame(unlist(list2)) %>% group_by(unlist(list2)) %>% summarize(n())
    
    # A tibble: 4 x 2
      `unlist(list2)` `n()`
                <int> <int>
    1               1    27
    2               2    23
    3               3    21
    4               4    25
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多