我正在尝试生成满足以下所有条件的所有组合数字的列表:
我尝试使用 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 方法的原因。
我想我们会调整它,但是采用
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