簡體   English   中英

如何避免替換長度為零錯誤

[英]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以邏輯向量開始,但一旦您用數字覆蓋其第一個值,它可能會被強制轉換為integernumeric 在這種情況下,向量所有位置的默認值將是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM