我对此非常困惑,我确信这很简单,希望有人能指出我正确的方向。
我正在使用TM软件包开发一个文本挖掘项目,当我在控制台中运行代码时,它可以正常工作,但是当我调用函数本身时,最终输出为空。
以下是一些示例代码:
func <- function(filename, count=100, full=FALSE){
packages <- c("ggplot2", "tm")
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))
}
library(tm)
library(ggplot2)
## get data
data <- read.csv(filename)
##Create corpus and remove formatting from text
Tickets <- Corpus(DataframeSource(data))
Tickets = tm_map(Tickets, removePunctuation)
Tickets = tm_map(Tickets, tolower)
##Create stopwords vector to remove complete list from data
stopwords <- read.csv("stopwords.csv", header=FALSE)
stopwords <- as.character(stopwords[,1])
stopwords <- c(stopwords("english"), stopwords)
## create full analasis of whole data, if selected by user
if(full==TRUE){
Tickets = tm_map(Tickets, PlainTextDocument) ##convert back to a text document we can analyse
Tickets.TDM <- TermDocumentMatrix(Tickets) ## create matrix for analysis
TDM.frame <- data.frame(as.matrix(Tickets.TDM))
write.csv(TDM.frame, "Full_queue_analysis.csv")
}
## Remove Stopwords and irrelevant data then convert to TDM for analysis
Tickets = tm_map(Tickets, removeWords, stopwords)
Tickets = tm_map(Tickets, removeNumbers)
Tickets = tm_map(Tickets, stripWhitespace)
Tickets = tm_map(Tickets, PlainTextDocument)
Tickets.TDM <- TermDocumentMatrix(Tickets)
## matrix to frame for additional calculations
TDM.frame <- data.frame(as.matrix(Tickets.TDM))
##count each word once word per entry and only display those which count more than user specified amount
Counts.df <- data.frame(rowSums(TDM.frame > 0))
colnames(Counts.df) <- "count"
Counts.df <- subset(Counts.df, count > count)
## create csv file for final counts
write.csv(Counts.df, "Queue_analysis.csv")
##Print basic analysis based on user option
cat("Terms which appear more than",count,"times:")
findFreqTerms(Tickets.TDM, count)
初始化Counts.df向量时,事情似乎出错了,我可以通过控制台完美地运行它,并使用正确的数据进行填充,但是当它在函数中运行时它完全是空的,尽管它确实存在。
没有错误,函数按预期结束,但打开csv文件时,只有“count”标题为空。
感谢您的任何建议!
编辑 - 添加了功能本身,抱歉!
答案 0 :(得分:1)
您认为count > count
在做什么?怎么能比自己大?给定显示的功能代码,100 > 100
将是subset
调用中subset()
参数中使用的内容。这评估为FALSE
(出于显而易见的原因)
> 100 > 100
[1] FALSE
因此你要丢弃所有行。
E.g:
> subset(mtcars, 100 > 100)
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 rows> (or 0-length row.names)
您的代码中存在逻辑错误,但我无法弄清楚您的意图,因此您需要自己解决。如果元素大于count
(在函数定义中默认设置为100
),您希望保留哪些计数向量?你的意思是
Count.df <- subset(Counts.df, Count.df[,1] > count)
啊,便士掉了。这只是与count
中subset()
的评估相关的问题。这是一个错误的简单例子:
> foo <- function(foo, cyl = 3) {
+ subset(mtcars, cyl > cyl)
+ }
> foo()
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 rows> (or 0-length row.names)
cyl
调用中的subset
被评估为函数定义cyl
中定义的cyl = 3
的值,而不是cyl
中的向量mtcars
subset(mtcars, FALSE)
数据框。因此,您得到Count.df
的结果。
那么你如何调用Count
count
中的列而不是Count.df <- subset(Counts.df, Count > count)
,然后让代码行为:
{{1}}
哪个应该有用。