Если вектор создается из вектора неизвестной длины с уникальными элементами путем повторения его неизвестное количество раз
small_v <- c("as","d2","GI","Worm")
big_v <- rep(small_v, 3)
тогда как определить, какой длины был этот вектор и сколько раз он повторялся?
Итак, в этом примере исходная длина была 4, и она повторяется 3 раза.
Реально в моем случае векторы будут довольно маленькими и будут повторяться всего несколько раз.
1) Если все элементы повторяются и других значений нет, используйте
length(big_v)/length(unique(big_v))
[1] 3
2) Или использовать
library(data.table)
max(rowid(big_v))
[1] 3
Хорошо, теперь я чувствую себя тупым.. На самом деле это было так просто.
1) Предполагая, что в small_v
есть хотя бы один уникальный элемент (что имеет место в вопросе, поскольку предполагается, что все элементы в small_v
уникальны):
min(table(big_v))
## [1] 3
или с помощью труб
big_v |> table() |> min()
## [1] 3
Вот более сложный тест, но он все еще работает, потому что small_v2[2]
уникален в small_v2
, хотя другие элементы small_v2
не уникальны.
# test data
small_v2 <- c(small_v, small_v[-2])
big_v2 <- rep(small_v2, 3)
min(table(big_v2))
## [1] 3
2) Если бы мы знали, что первый элемент small_v
уникален (что имеет место в вопросе, поскольку предполагается, что все элементы в small_v
уникальны), то это сработает:
sum(big_v[1] == big_v)
## [1] 3
В качестве альтернативы мы могли бы использовать rle
с with
для подсчета повторов.
with(rle(sort(big_v)), max(lengths))
Created on 2023-02-04 with reprex v2.0.2
[1] 3
Проблема в том, что у меня нет small_v. Только Big_v.