Как подсчитать количество вхождений определенной последовательности чисел в столбце?

Это будет немного странно, у меня есть столбец из 750 строк заполняется целыми числами в диапазоне от 1-10. Я пытаюсь смотреть на эти данные как серия из 3 последовательностей строк и count количество вхождений для каждой последовательности, как это показано на следующем снимке экрана :

попытка найти и подсчитать 3 последовательности ячеек в excel. Столбец A является столбцом наблюдения с целыми числами от 1-3. Столбец I содержит список всех наблюдаются 3-значные последовательности, а столбец J-количество вхождений каждой из этих последовательностей наблюдается

столбец A является столбцом наблюдения с целочисленными значениями от 1-3 для данного примера. Столбец I содержит список всех наблюдаемых 3-значных последовательностей, а столбец J-количество вхождений каждой из этих последовательностей. Столбец I отображается как текстовое значение, но было бы лучше, чтобы один столбец превратился в 3 отдельных столбца; по одному для каждого значения в столбце. последовательность.

Я пытаюсь это как шаг для создания матрицы наблюдений Марковской цепи 2-го порядка. В предыдущей версии мне нужна была только матрица первого порядка, которая состояла из двух последовательностей значений. Я сделал это, создав 100 столбцов; один для каждой возможной комбинации. Затем в каждой строке каждого из этих столбцов я посмотрел ячейку на наблюдаемое значение (столбец A) для этой строки и строку над ней, и если последовательность соответствует последовательности для этого столбца, она выведет 1. В конце концов я суммировал каждый столбец и использовал эту информацию для создания счетчиков для матрицы наблюдений.

Я попытался записать это как массивную сетку всех возможных комбинаций, используемую в клеточных функциях, но быстро стало очевидно, что этот подход не сработает; 1000 столбцов из 750 строк представляют собой вычислительную проблему. Мне кажется, что может быть простой способ сделать это-vba, но я не уверен, возможно ли это вообще. Я начал преподавать себя, но есть еще многое, чего я не знаю. Это вообще возможно, или я зря трачу свое время?

Мне нужны два выхода: мне нужен список всех наблюдаемых последовательностей. Целые числа могут быть от 1-10, но не все 10, или может присутствовать вся комбинация из 10. Мне не нужны комбинации, которые не встречаются. Мне также нужно знать, сколько раз каждая последовательность наблюдается.

Я запускаю это на ПК с Windows 7 С помощью Microsoft Excel 1010. Я использую Microsoft Excel, поскольку это единственная математическая программа у меня есть, и это тот, который я наиболее комфортно.

14
задан David Oliver
21.01.2023 11:09 Количество просмотров материала 2880
Распечатать страницу

3 ответа

вам не нужен Excel. Для начала попробуйте этот он-лайн инструмент анализатора ngram.

в текстовом поле попробуйте ввести 8 3 4 3 1 7 8 3 8 3 8. Выберите Using Frequency, и показать trigrams что происходить не менее one раза.

отправить его, то вы получите список триграмм вместе с их частотами. Просто игнорируйте строки с одним или двумя числами.


Если вам нужно это поведение динамически и программно, я мог бы помочь вам сделать сценарий это делает именно этот расчет на основе пользовательского ввода.

1
отвечен Jerome Indefenzo 2023-01-22 18:57

Я не мог не найти решение для этого. Вместо этого я использовал R, потому что это просто имеет смысл. Код приведен ниже, а также доступен на этом R-Fiddle

Пожалуйста, обратите внимание, что код ниже есть раздел для генерации пробных данных. На практике вам придется заменить их фактическими данными, которые будут храниться в векторе с именем x как описано в коде.

если вы не заботите о замечаниях, то которые не происходят, тогда код очень простой:

x <- c("01", "02", "03", "01", "02", "03", "01", "02 ", "03") # your Column A
n <- 3 # number of elements in each combination. configurable.

# create a vector with n-sized sequences of characters. (e.g. n = 3 -> "XX-YY-ZZ")
mydata <- x
for (i in 2:n) {
    y <- c(x[-i], x[i])
    mydata <- paste(mydata, y, sep="-")
}

# calculate the frequency of each observation and save into data table
frequencies <- data.frame(table(mydata))
head(frequencies)

выход тогда будет что-то вроде:

    mydata Freq
1 01-02-02    2
2 01-04-04    2
3 01-05-05    1
4 01-07-07    1
5 01-10-10    1
6 02-02-02    1

если вы заботитесь о том, чтобы показать все возможности, код немного грязнее:

n <- 3 # number of elements in each combination. configurable.

# -----------------------------------------------------------------------------------#
#            THIS PART SIMPLY GENERATES MOCK DATA. REPLACE WITH ACTUAL DATA          #
# -----------------------------------------------------------------------------------#
universe <- 1:10 # your range of numbers
m <- 100 # number of rows in the mock data

# generate some mock data with a simple m-sized vector of numbers within 'universe'
set.seed(1337) # hardcode random seed so mock data can be reproduced
x <- sample(universe, m, replace=TRUE)
x <- formatC(x, width=nchar(max(universe)), flag=0) # pad our data with 0s as needed
# -----------------------------------------------------------------------------------#
#                               END OF MOCK DATA PART                                #
# -----------------------------------------------------------------------------------#
# At this point, you should have a variable x which contains a sequence of
# numbers stored as characters (text) e.g. "01" "04" "10" "04" "06"

# create a vector with n-sized sequences of characters. (e.g. n = 3 -> "XX-YY-ZZ")
mydata <- x
for (i in 2:n) {
    y <- c(x[-i], x[i])
    mydata <- paste(mydata, y, sep="-")
}

# calculate the frequency of each observation and save into data table
frequencies <- data.frame(table(mydata))

# generate all possible permutations and save them to a data table called
p <- as.matrix(expand.grid(replicate(n, universe, simplify=FALSE)))
p <- formatC(p, width=nchar(max(universe)), flag=0)
q <- apply(p, 1, paste, collapse="-")
permutations <- data.frame(q, stringsAsFactors=FALSE) # broken into separate   step for nicer variable name in df
permutations$Freq <- 0 # fill with zeroes 
permutations$Freq[match(frequencies$mydata, permutations$q)] <- frequencies$Freq

head(permutations)

вывод будет примерно таким:

         q Freq
1 01-01-01    0
2 02-01-01    0
3 03-01-01    2
4 04-01-01    0
5 05-01-01    1
6 06-01-01    0
0
отвечен Andre Terra 2023-01-22 21:14

используйте вспомогательный столбец, который объединяет данные в группы по 3, а затем a) используйте countif для подсчета последовательностей. или b) используйте сводную таблицу.

в ячейку B2 ставить =CONCATENATE(A2,",",A3,",",A4) и перетащите вниз (двойной щелчок в правом нижнем углу)

countif метод

потом, положив =COUNTIF(B:B,I2) в J2, вы получаете итоги, как показано ниже.

countif

Если вам не нравится 0s, то просто автофильтр. Хотя я предполагаю, что ты будешь используя больший набор данных, чем этот, и, вероятно,не будет иметь.

enter image description here

таблицы

более продвинутый и ИМХО более изящное решение-использовать сводную таблицу. Используя ту же формулу в столбце B.

вставьте сводную таблицу на основе таблицы в cols A и B. с "метками строк" как столбец B и значениями как COUNT (не sum) столбца Б.

enter image description here

enter image description here

вам не нужно вводить последовательности для подсчета, excel просто находит все в столбце B автоматически.

кроме того, это обобщенное решение для любой длины последовательностей и любого количества используемых цифр (просто добавьте больше ячеек в свою конкатенацию в столбце B). Кроме того, например, поиск 5-значных последовательностей в данные:

1
2
3
4
5
5
4
3
2
1

повторить для 100 строк дает:

enter image description here

кусок пирога.

0
отвечен Some_Guy 2023-01-22 23:31

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх