[英]How can I avoid replacement has length zero error
我正在嘗試生成文檔的詞頻矩陣,然后在該矩陣的給定查詢中查找某個單詞的頻率。 最后,我想總結查詢中單詞的頻率。 但是,我正在處理錯誤消息:特征 [i] <- x 中的錯誤:替換長度為零
我一般沒有很多編碼經驗,這是我第一次使用 R,因此我很難解決這個錯誤。 我認為它與空值有關。 我已經嘗試使用 apply function 來避免嵌套的 for 循環,因為我認為這可能會有所幫助(雖然不確定),但我不太了解如何將 for 循環轉換為 apply function。
termfreqname <- function(queries,docs){
n <- length(queries)
feature <- vector(length=n)
for(i in 1:n){
query <- queries[i]
documentcorpus <- c(docs[i])
tdm <- TermDocumentMatrix(tm_corpus) #creates the term frequency matrix per document
m <- sapply(strsplit(query, " "), length) #length of the query in words
totalfreq <- list(0) #initialize list
freq_counter <- rowSums(as.matrix(tdm)) #counts the occurrence of a given word in the tdm matrix
for(j in 1:m){
freq <- freq_counter[word(query,j)] #finds frequency of each word in the given query, in the term frequency matrix
totalfreq[[j]] <- freq #adds this frequency to position j in the list
}
x <- reduce(totalfreq,'+') #sums all the numbers in the list
feature[i] <- x #adds this number to feature list
feature
}
}
這取決於您的需求,但最重要的是您需要添加一些if
語句。 如何使用它取決於您是否希望向量的默認值保持不變。 在您的代碼中,雖然feature
以邏輯向量開始,但一旦您用數字覆蓋其第一個值,它可能會被強制轉換為integer
或numeric
。 在這種情況下,向量所有位置的默認值將是0
(或0L
,如果是整數)。 這將影響您對如何使用if
語句的決定。
if (length(x)) feature[i] <- x
如果x
對象具有長度(相當於if (length(x) > 0)
),這只會嘗試覆蓋feature
的第i
個值。 在這種情況下,由於向量中的默認值將為零,這意味着當您完成時,您將無法區分已知為0
的元素和未能找到任何內容的元素。
替代方案(以及我的偏好/建議):
feature[i] <- if (length(x)) x else NA
在這種情況下,完成后,您可以清楚地區分已知零 ( 0
) 和不確定/未知值 ( NA
)。 在對該向量進行數學運算時,您可能需要/需要na.rm=TRUE
...但這一切都取決於您的使用。
順便說一句,正如 MartinGal 所指出的,您對reduce(totalfreq, '+')
的使用有點缺陷: 'x'
可能不會(不是?)被識別為已知的 function。 解決這個問題的第一個方法是在 function 周圍使用反引號,所以
totalfreq <- 5:7
reduce(totalfreq, '+')
# NULL
reduce(totalfreq, `+`)
# [1] 18
sum(totalfreq)
# [1] 18
最后一種是更受歡迎的方法。 為什么? 例如,對於長度為 4 的向量,它獲取前兩個並將它們相加,然后獲取該結果並將其添加到第三個,然后獲取該結果並添加到第四個。 三操作。 當您有 100 個元素時,它將進行 99 個單獨的添加。 sum
執行一次,這確實對性能有影響(漸近)。
但是,如果totalfreq
是一個list
,那么這會稍微改變:
totalfreq <- as.list(5:7)
reduce(totalfreq, `+`)
# [1] 18
sum(totalfreq)
# Error in sum(totalfreq) : invalid 'type' (list) of argument
# x
sum(unlist(totalfreq))
# [1] 18
reduce
代碼仍然有效,並且sum
本身會失敗,但我們可以unlist
列出列表,有效地創建一個向量,然后對其調用sum
。 漸近地快得多。 也許更清晰,更具說明性。
(我假設purrr::reduce
,順便說一句......)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.