如何避免替换长度为零错误
How can I avoid replacement has length zero error
我正在尝试生成文档的词频矩阵,然后在该矩阵的给定查询中查找特定词的频率。最后,我想对查询中单词的频率求和。
但是,我正在处理错误消息:特征 [i] <- x 中的错误:替换的长度为零
总的来说,我没有太多的编码经验,这是我第一次使用 R,因此我很难解决这个错误。我认为它与空值有关。我已经尝试使用 apply 函数避免嵌套的 for 循环,因为我认为这可能会有所帮助(虽然不确定),但我不太了解如何将 for 循环转换为 apply 函数。
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
的元素和未找到任何元素的元素。
备选方案(和我的 preference/recommendation):
feature[i] <- if (length(x)) x else NA
在这种情况下,完成后,您可以清楚地区分已知零值 (0
) 和 uncertain/unknown 值 (NA
)。在对该向量进行数学运算时,您可能 want/need na.rm=TRUE
...但这完全取决于您的用途。
顺便说一句,正如 MartinGal 指出的那样,您对 reduce(totalfreq, '+')
的使用有点缺陷:'x'
可能不会(不是吗?)被识别为已知函数。第一个解决方法是在函数周围使用反引号,所以
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
列表,有效地创建一个向量,然后调用[=31= 】 在那之上。渐近地快得多。也许更清晰、更明确。
(我假设 purrr::reduce
,顺便说一句 ...)
我正在尝试生成文档的词频矩阵,然后在该矩阵的给定查询中查找特定词的频率。最后,我想对查询中单词的频率求和。 但是,我正在处理错误消息:特征 [i] <- x 中的错误:替换的长度为零
总的来说,我没有太多的编码经验,这是我第一次使用 R,因此我很难解决这个错误。我认为它与空值有关。我已经尝试使用 apply 函数避免嵌套的 for 循环,因为我认为这可能会有所帮助(虽然不确定),但我不太了解如何将 for 循环转换为 apply 函数。
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
的元素和未找到任何元素的元素。
备选方案(和我的 preference/recommendation):
feature[i] <- if (length(x)) x else NA
在这种情况下,完成后,您可以清楚地区分已知零值 (0
) 和 uncertain/unknown 值 (NA
)。在对该向量进行数学运算时,您可能 want/need na.rm=TRUE
...但这完全取决于您的用途。
顺便说一句,正如 MartinGal 指出的那样,您对 reduce(totalfreq, '+')
的使用有点缺陷:'x'
可能不会(不是吗?)被识别为已知函数。第一个解决方法是在函数周围使用反引号,所以
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
列表,有效地创建一个向量,然后调用[=31= 】 在那之上。渐近地快得多。也许更清晰、更明确。
(我假设 purrr::reduce
,顺便说一句 ...)