过滤 Expand.Grid 的结果

问题描述 投票:0回答:1

我正在尝试生成满足以下所有条件的所有组合数字的列表:

  • 任何组合的长度都是 6 个数字
  • 可能的数字只有1,5,7
  • 1 后面只能跟 1 或 5
  • 5 后面只能跟 5 或 7
  • 7 后面只能跟 7
  • 必须至少有两个1

我尝试使用 Expand.grid 函数来做到这一点。

第1步:首先,我生成了一个包含1、5、7的所有6种长度组合的列表:

numbers <- c(1, 5, 7)
all_combinations <- data.frame(expand.grid(rep(list(numbers), 6)))

第2步:然后,我尝试添加变量来满足条件:

all_combinations$starts_with_1 <- ifelse(all_combinations$Var1 == 1, "yes", "no")
all_combinations$numbers_ascending  <- apply(all_combinations, 1, function(x) all(diff(as.numeric(x)) >= 0))


all_combinations$numbers_ascending  <- ifelse(all_combinations$numbers_ascending , "yes", "no")


all_combinations$at_least_two_ones <- apply(all_combinations, 1, function(x) sum(x == 1) >= 2)

all_combinations$at_least_two_ones <- ifelse(all_combinations$at_least_two_ones, "yes", "no")

第3步:最后,我尝试保留满足所有3个条件的行:

all_combinations <- all_combinations[all_combinations$starts_with_1 == "yes" & all_combinations$numbers_ascending == "yes" & all_combinations$at_least_two_ones == "yes", ]

all_combinations

然而,结果都是NA:

      Var1 Var2 Var3 Var4 Var5 Var6 starts_with_1 numbers_ascending at_least_two_ones
NA      NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.1    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.2    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.3    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.4    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.5    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.6    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.7    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.8    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.9    NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.10   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.11   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.12   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.13   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.14   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.15   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.16   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.17   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.18   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.19   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>
NA.20   NA   NA   NA   NA   NA   NA          <NA>              <NA>              <NA>

注意:我尝试以灵活的方式执行此操作,以便如果我需要更改某些内容(例如修改为至少三个 1,或修改为出现在 5 之前的 7),我可以快速创建一个变量来测试这个条件。这就是我使用 Expand.grid 方法的原因。

r
1个回答
0
投票

我想我们会调整它,但是采用

regex
的方法怎么样?
看看这个:

library(tidyverse)

# ----------------
my_numbers <- c(1, 5, 7)
my_combinations <- data.frame(expand.grid(rep(list(my_numbers), 6)))

# Patterns
looking <- str_c(
  sep = "|",
  "1{2}")

not_looking <- str_c(
  sep = "|",
  "17",
  "51",
  "71", "75")

# ----------------
my_output <- my_combinations %>% 
  rowwise() %>% 
  mutate(combo = str_flatten(c_across(starts_with("var")))) %>% 
  filter(str_detect(combo, looking), !str_detect(combo, not_looking))

输出:

> my_output
# A tibble: 11 × 7
# Rowwise: 
    Var1  Var2  Var3  Var4  Var5  Var6 combo 
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> 
 1     1     1     1     1     1     1 111111
 2     1     1     1     1     1     5 111115
 3     1     1     1     1     5     5 111155
 4     1     1     1     5     5     5 111555
 5     1     1     5     5     5     5 115555
 6     1     1     1     1     5     7 111157
 7     1     1     1     5     5     7 111557
 8     1     1     5     5     5     7 115557
 9     1     1     1     5     7     7 111577
10     1     1     5     5     7     7 115577
11     1     1     5     7     7     7 115777

创建于 2024-05-01,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.