假设我们已经给出了数列:
z=c(1,2,3,4,5)我希望通过以下方式从这个给定的数字序列创建所有可能的类(大小不同):
1)最简单的情况是当类大小为1,即所有类大小相等时。在这种情况下,我们有以下几类: 1-2,2-3,3-4和4-5.
2)一个或多个类别的大小可等于2。
( a)我们可以有一个大小为2的类和其他大小为1的类,如下所示:1-3、3-4和4-5。同样,1-2,2-4和4-5,1-2,2-3和3-5.
( b)我们也可能有2类大小为2的案例。例如: 1-3和3-5。
3)当一个等级的大小是3,一个是1的,例如1-4和4-5 & 1-2和2-5。
4)最后,我们将有一种情况,即班级规模为4,即1-5。
请注意,在所有上述情况下,上一个类的上限等于下一个类的下限(即使类大小不等)。
在R中有办法做到这一点吗?任何帮助都将不胜感激。谢谢。
发布于 2019-04-27 19:34:41
编辑:使用partition包添加特定的实现。
按照描述的方式,这听起来像是一种思考的方法,因为你有5个槽,它们之间有4个范围(破折号),有3个潜在的墙将范围与相邻的邻居隔开。
| | |
1-2-3-4-5您可以通过切换每个障碍,从所有打开的组合:
0 0 0
1-2-3-4-5
one with class of sizes of 4对所有已关闭的人:
| | |
1-2-3-4-5
one case with class sizes of 1
1-2
2-3
3-4
4-5所以这些组合是从000 (0)到111 (7)的所有二进制数,总共是8,等于2^n,其中n是墙的数目,也就是减去2的元素数。
一种方法可以使用这样的伪代码:
看起来在R中至少有一个包可以为您解决分区问题。下面是一个使用这个和tidyverse操作的实现。
library(tidyverse)
partitions::compositions(4) %>%
as.matrix() %>%
as_tibble() %>%
mutate(position = row_number()) %>%
gather(combo_num, segment_length, -position) %>%
filter(segment_length > 0) %>%
mutate(segment_label = paste0(position, "-", position + segment_length)) %>%
select(-segment_length) %>%
spread(position, segment_label)
# A tibble: 8 x 5
combo_num `1` `2` `3` `4`
<chr> <chr> <chr> <chr> <chr>
1 V1 1-5 NA NA NA
2 V2 1-2 2-5 NA NA
3 V3 1-3 2-4 NA NA
4 V4 1-2 2-3 3-5 NA
5 V5 1-4 2-3 NA NA
6 V6 1-2 2-4 3-4 NA
7 V7 1-3 2-3 3-4 NA
8 V8 1-2 2-3 3-4 4-5 https://stackoverflow.com/questions/55883774
复制相似问题