這會有點奇怪,我有一列 750 行,填滿了從 1 到 10 的整數。我試圖將該數據視為3 行序列系列, 和數數每個序列出現的次數,如以下螢幕截圖所示:
嘗試在 Excel 中尋找並計算 3 個儲存格序列。 A 列是觀察列,具有 1-3 之間的整數值。 I 列是所有觀察到的 3 值序列的列表,J 列是觀察到的每個序列的出現次數
A 列是觀察列,本例的整數值為 1-3。 I 列是所有觀察到的 3 值序列的列表,J 列是觀察到的每個序列的出現次數。第一列顯示為文字值,但最好將該一列變成 3 個單獨的列;序列中的每個值一個。
我嘗試將此作為創建二階馬可夫鏈的觀察矩陣的步驟。在先前的版本中,我只需要一個一階矩陣,它由 2 個值序列組成。我透過建立 100 個列來實現這一點;每一種可能的組合都有一個。然後,在每一列的每一行中,我讓單元格查看該行及其上方的行的觀察值(A 列),如果序列與該列的序列匹配,它將輸出 1。求和,並使用該資訊產生觀察矩陣的計數。
我試圖將其寫成一個由單元格函數中使用的所有可能組合組成的龐大網格,但很快就發現這種方法行不通; 750 行 1000 列會帶來計算問題。我突然想到,可能有一個簡單的方法可以做到這一點,那就是 vba,但我不確定這是否可能。我已經開始自學了,但還有很多我不知道的地方。有可能嗎,還是我在浪費時間?
我需要兩個輸出:我需要所有觀察到的序列的清單。整數可以是1-10,但不是全部10,或可以存在10的所有組合。我不需要那些不會出現的組合。我還需要知道每個序列被觀察的次數。
我使用 Microsoft Excel 1010 在 Windows 7 PC 上執行此程式。
答案1
您不需要 Excel。首先,嘗試這個線上 ngram 分析工具。
在文字欄位中,嘗試輸入8 3 4 3 1 7 8 3 8 3 8
.選擇Using Frequency
,並顯示trigrams
至少出現one
次數。
提交它,然後您將獲得一個八卦列表及其頻率。只需忽略僅包含一兩個數字的行即可。
如果您以動態和程式設計方式需要此行為,我可以幫助您製作一個腳本,根據使用者輸入精確執行此計算。
答案2
我忍不住想找到解決方法。我用 R 代替,因為它很有意義。程式碼如下,也可在此取得R-小提琴
請注意,下面的程式碼有一個用於產生模擬資料的部分。實際上,您實際上必須將其替換為實際數據,這些數據將儲存在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
答案3
使用輔助列以 3 為一組連接數據,然後 a) 使用 countif 對序列進行計數。或 b) 使用資料透視表。
在儲存格 B2 中放置=CONCATENATE(A2,",",A3,",",A4)
並向下拖曳(雙擊右下角)
計數法
然後,輸入=COUNTIF(B:B,I2)
J2,您將得到總數,如下所示。
如果您不喜歡 0,則只需自動過濾即可。儘管我想您將使用比這更大的資料集,並且可能不會有任何資料集。
數據透視表
更先進、更優雅的解決方案是使用資料透視表。在 B 列中使用相同的公式。
根據 A 列和 B 列中的表插入資料透視表。
您不必鍵入要計數的序列,Excel 會自動尋找 B 列中的所有內容。
此外,它也是適用於任意長度序列和任意數量數字的通用解決方案(只需在 B 列中的串聯中添加更多單元格即可)。另外,例如在資料中尋找 5 位數字序列:
1
2
3
4
5
5
4
3
2
1
重複 100 行得出:
小菜一碟。