Como eu conto o número de ocorrências de uma seqüência específica de números dentro de uma coluna?

1

Isso vai ser um pouco estranho, eu tenho uma coluna de 750 linhas preenchida com números inteiros variando de 1-10. Estou tentando analisar esses dados como uma série de 3 sequências de linhas e contar o número de ocorrências para cada sequência, conforme mostrado na captura de tela a seguir:

Tentando encontrar e contar 3 sequências de células no excel. A coluna A é a coluna de observação, com valores inteiros de 1-3. A coluna I é uma listagem de todas as sequências de 3 valores observadas, e a coluna J é o número de ocorrências que cada uma dessas sequências é observada

Coluna A é a coluna de observação, com valores inteiros de 1-3 para este exemplo. A coluna I é uma listagem de todas as sequências de 3 valores observadas e a coluna J é o número de ocorrências de cada uma dessas sequências. A coluna I é exibida como um valor de texto, mas seria melhor que essa coluna fosse transformada em 3 colunas separadas. um para cada valor na sequência.

Estou tentando isso como um passo para criar a matriz de observação de uma cadeia de Markov de segunda ordem. Em uma versão anterior, eu só precisava de uma matriz de primeira ordem, composta de duas sequências de valor. Eu consegui isso criando 100 colunas; um para cada combinação possível. Então, em cada linha de cada uma dessas colunas, eu fiz a célula ver o valor observado (coluna A) para aquela linha, e a linha acima dela, e se a sequência correspondesse à sequência daquela coluna, ela produziria um 1. No final, somei cada coluna e usei essa informação para gerar as contagens da matriz de observação.

Eu tentei escrever isso como uma grade massiva de todas as combinações possíveis usando funções de célula, mas rapidamente ficou óbvio que essa abordagem não funcionaria; 1000 colunas de 750 linhas representam um problema computacional. Parece-me que pode haver uma maneira simples de fazer isso, mas não tenho certeza se é mesmo possível. Eu comecei a me ensinar, mas ainda há muita coisa que eu não sei. É possível ou estou perdendo meu tempo?

Existem duas saídas que eu preciso: Eu preciso da lista de todas as sequências observadas. Os números inteiros podem ser de 1-10, mas nem todos os 10, ou todas as combinações de 10 podem estar presentes. Eu não preciso das combinações que não ocorrem. Eu também preciso saber o número de vezes que cada seqüência é observada.

Estou executando isso em um PC com Windows 7 usando o Microsoft Excel 1010. Estou usando o Microsoft Excel porque é o único programa de matemática que tenho, e é o que eu estou mais confortável com.

    
por David Oliver 19.10.2016 / 10:29

3 respostas

1

Você não precisa do Excel. Para começar, experimente esta ferramenta analisadora de ngram online .

No campo de texto, tente colocar em 8 3 4 3 1 7 8 3 8 3 8 . Escolha Using Frequency e mostre trigrams que ocorre pelo menos one vezes.

Envie-o, então você terá uma lista de trigramas junto com suas freqüências. Apenas ignore as linhas com apenas um ou dois números.

Se você precisar desse comportamento de maneira dinâmica e programática, eu posso ajudá-lo a criar um script que faça exatamente esse cálculo com base na entrada do usuário.

    
por 19.10.2016 / 20:15
0

Não pude deixar de encontrar uma solução para isso. Eu usei o R, porque isso faz sentido. O código está abaixo, e também está disponível neste R-Fiddle

Por favor, observe que o código abaixo tem uma seção para gerar dados simulados. Na prática, você terá que substituir isso pelos dados reais que seriam armazenados em um vetor chamado x , conforme explicado no código.

Se você não se importa com as observações que não ocorrem, então o código é muito simples:

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)

A saída será algo como:

    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

Se você se preocupa em mostrar todas as possibilidades, o código está um pouco confuso:

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)

A saída será algo como:

         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
    
por 20.10.2016 / 21:08
0

Use uma coluna auxiliar que concatene os dados em grupos de 3 e, em seguida, a) use countif para contar as seqüências. ou b) use uma tabela dinâmica.

Na célula B2 coloque =CONCATENATE(A2,",",A3,",",A4) e arraste para baixo (clique duas vezes no canto inferior direito)

método countif

depois, colocando =COUNTIF(B:B,I2) em J2, você recebe os totais, como abaixo.

sevocênãogostados0s,apenasoautofiltro.Emboraeuimaginequevocêestejausandoumconjuntodedadosmaiorqueesteeprovavelmentenãoteránenhum.

pivotável

Umasoluçãomaisavançadaemaiseleganteseriausarumpivottable.UsandoamesmafórmulanacolunaB.

InsiraumpivotávelbaseadonatabelanoscolsAeB.Com"ROW LABELS" como Coluna B e valores como COUNT (não soma) da coluna B.

Vocênãoprecisadigitarassequênciasaseremcontadas,oexcelapenasencontratudonacolunaBautomaticamente.

Alémdisso,éumasoluçãogeneralizadaparaqualquertamanhodesequênciaequalquernúmerodedígitosusados(bastaadicionarmaiscélulasàsuaconcatenaçãonacolunaB).Alémdisso,porexemplo,procurandosequênciasde5dígitosnosdados:

1234554321

repetidopor100linhasdá:

Pedaço de bolo.

    
por 21.10.2016 / 16:17