[英]R - loop through a list and calculate values to be stored in matrix
晚上好,我有以下清單:
lf <- 1 / 100 * c(
A = 6.756, B = 1.234, C = 2.302, D = 3.518, E = 10.508, F = 1.843, G = 1.667,
H = 5.041, I = 5.763, J = 0.127, K = 0.639, L = 3.330, M = 1.990, N = 5.583,
O = 6.210, P = 1.596, Q = 0.079, R = 4.953, S = 5.234, T = 7.492, U = 2.282,
V = 0.809, W = 1.952, X = 0.124, Y = 1.633, Z = 0.061, ` ` = 17.272)
和一段文字:
text <- c("THIS IS A TEST")
我正在嘗試編寫一個循環,以便文本中的每個字母都從 lf 接收到正上方的數字。 我希望它存儲在一個矩陣中,以便在應用函數后我可以找到最大值。
我開始了
n <- length(lf)
mat <- matrix(ncol=2, nrow=n)
for (i in 1:n) {
var1[[i]] <-
}
但我似乎無法解決這個問題。 如何編寫一個函數來遍歷列表 (lf) 的值並將每個計算值存儲在矩陣中?
非常感謝幫助 =)
上面的數字代表對數似然(這是一個密碼問題)。 我要找到一個字母(即“K”)在嘗試解密用一個字母加密的代碼時給出的所有可能性的最低總和。
我已經找到了如何獲得給定文本(包括空格)的總和
sum(log(letterfrequencies[match(plaintext, names(letterfrequencies))]))
現在,我必須在我認為我需要一個循環來嘗試每個字母的加密文本上嘗試每個字母時找到最低的對數可能性
(因為我沒有正確解釋問題,我刪除了我之前的問題)
您可以在沒有循環的情況下執行此操作:
sapply(strsplit(text, ""), function(x) lf[x])
#> [,1]
#> T 0.07492
#> H 0.05041
#> I 0.05763
#> S 0.05234
#> 0.17272
#> I 0.05763
#> S 0.05234
#> 0.17272
#> A 0.06756
#> 0.17272
#> T 0.07492
#> E 0.10508
#> S 0.05234
#> T 0.07492
如果您只想對單個字母的值求和,一個小包裝函數應該可以解決問題:
sum_letters <- function(letter, text) {
sum(strsplit(text, "")[[1]] %in% letter) * lf[letter]
}
這允許您執行以下操作:
sum_letters("T", text)
#> T
#> 0.22476
或者獲取字母表中所有字母的總和:
sums <- sapply(LETTERS, sum_letters, text = text, USE.NAMES = FALSE)
sums
#> A B C D E F G H I J
#> 0.06756 0.00000 0.00000 0.00000 0.10508 0.00000 0.00000 0.05041 0.11526 0.00000
#> K L M N O P Q R S T
#> 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.15702 0.22476
#> U V W X Y Z
#> 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
從而找到最合適的:
which.max(sums)
#> T
#> 20
由reprex 包(v0.3.0) 於 2020 年 11 月 1 日創建
我們可以直接使用matrix
as.matrix( lf[regmatches(text, gregexpr('[A-Z ]', text))[[1]]])
-輸出
# [,1]
#T 0.07492
#H 0.05041
#I 0.05763
#S 0.05234
# 0.17272
#I 0.05763
#S 0.05234
# 0.17272
#A 0.06756
# 0.17272
#T 0.07492
#E 0.10508
#S 0.05234
#T 0.07492
如果我們需要按sum
分組
v1 <- lf[regmatches(text, gregexpr('[A-Z ]', text))[[1]]]
tapply(v1, names(v1), FUN = sum)
# A E H I S T
#0.51816 0.06756 0.10508 0.05041 0.11526 0.15702 0.22476
如果我們需要包含所有LETTERS
sapply(split(v1, factor(names(v1), levels = LETTERS)), sum)
# A B C D E F G H I J K L M N O P
#0.06756 0.00000 0.00000 0.00000 0.10508 0.00000 0.00000 0.05041 0.11526 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
# Q R S T U V W X Y Z
#0.00000 0.00000 0.15702 0.22476 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.