Как получить все последовательные подмножества вектора?
Если я хочу получить все подмножества вектора, я могу, например. используйте пакет sets
:
library(sets)
v <- c("test1", "test2", "test3", "test4")
set_power(v)
## {{}, {"test1"}, {"test2"}, {"test3"}, {"test4"}, {"test1",
## "test2"}, {"test1", "test3"}, {"test1", "test4"}, {"test2",
## "test3"}, {"test2", "test4"}, {"test3", "test4"}, {"test1",
## "test2", "test3"}, {"test1", "test2", "test4"}, {"test1",
## "test3", "test4"}, {"test2", "test3", "test4"}, {"test1",
## "test2", "test3", "test4"}}
Мой вопрос
Как получить только все подмножества, где все элементы являются последовательными, поэтому в приведенном выше случае без {"test1", "test3"}, {"test1", "test4"}, {"test2", "test4"}, {"test1", "test2", "test4"}, {"test1", "test3", "test4"}
Ответы
Ответ 1
Попробуйте rollapply
следующим образом:
library(zoo)
v <- c("test1", "test2", "test3", "test4")
L <- lapply(seq_along(v), rollapply, data = v, c)
L[[1]] <- matrix(L[[1]])
предоставляет компоненты length(v)
, по одному для каждого размера подмножества:
[[1]]
[,1]
[1,] "test1"
[2,] "test2"
[3,] "test3"
[4,] "test4"
[[2]]
[,1] [,2]
[1,] "test1" "test2"
[2,] "test2" "test3"
[3,] "test3" "test4"
[[3]]
[,1] [,2] [,3]
[1,] "test1" "test2" "test3"
[2,] "test2" "test3" "test4"
[[4]]
[,1] [,2] [,3] [,4]
[1,] "test1" "test2" "test3" "test4"
или как плоский список с одним компонентом для каждого подмножества:
flat <- do.call("c", lapply(L, function(x) split(x, 1:nrow(x))))
даяние:
> str(flat)
List of 10
$ 1: chr "test1"
$ 2: chr "test2"
$ 3: chr "test3"
$ 4: chr "test4"
$ 1: chr [1:2] "test1" "test2"
$ 2: chr [1:2] "test2" "test3"
$ 3: chr [1:2] "test3" "test4"
$ 1: chr [1:3] "test1" "test2" "test3"
$ 2: chr [1:3] "test2" "test3" "test4"
$ 1: chr [1:4] "test1" "test2" "test3" "test4"
Ответ 2
A base R
будет embed
lapply(seq_along(v), function(i) embed(v, i)[, i:1, drop = FALSE])
#[[1]]
# [,1]
#[1,] "test1"
#[2,] "test2"
#[3,] "test3"
#[4,] "test4"
#[[2]]
# [,1] [,2]
#[1,] "test1" "test2"
#[2,] "test2" "test3"
#[3,] "test3" "test4"
#[[3]]
# [,1] [,2] [,3]
#[1,] "test1" "test2" "test3"
#[2,] "test2" "test3" "test4"
#[[4]]
# [,1] [,2] [,3] [,4]
#[1,] "test1" "test2" "test3" "test4"