如何保留ID并将DTM与原Data Frame合并以减少推文丢失?
解决DTM保留原推文ID及数据合并问题
我明白你遇到的痛点——清理空文档后,DTM和原数据框行数不匹配,还没法直接关联原推文ID。下面是一套实操性的解决方案,分步骤帮你搞定:
步骤1:创建绑定原ID的语料库
首先要让语料库的每个文档都和原数据框的推文ID绑定,这样后续过滤后还能精准追踪对应ID。推荐用DataframeSource创建语料库,它能更方便地保留元数据:
# 准备用于生成语料库的数据框,指定文本列和ID列 corpus_df <- data.frame( text = ngram.features.df$X1, id = ngram.features.df$ID, stringsAsFactors = FALSE ) # 将行名设为原ID,确保语料库文档ID与原数据完全对应 rownames(corpus_df) <- corpus_df$id # 创建带ID标记的语料库 tweets.corpus <- VCorpus(DataframeSource(corpus_df))
步骤2:过滤空文档并生成目标DTM
接下来计算文档长度,过滤掉空文档,同时保证ID的关联关系不丢失:
# 计算所有文档的词数总和 doc.lengths <- rowSums(as.matrix(DocumentTermMatrix(tweets.corpus))) # 生成需要保留的文档的逻辑索引 keep_indices <- doc.lengths > 0 # 过滤语料库(仅保留非空文档) filtered_corpus <- tweets.corpus[keep_indices] # 生成符合要求的DTM mydtm <- DocumentTermMatrix(filtered_corpus, control = list(wordLengths = c(3,10)))
步骤3:给DTM添加原推文ID
现在从过滤后的语料库中提取ID,把它和DTM绑定成带ID的数据框:
# 提取过滤后文档对应的原推文ID filtered_ids <- sapply(filtered_corpus, function(doc) meta(doc, "id")) # 将DTM转换为数据框,并添加ID列 dtm_with_id <- cbind( ID = filtered_ids, as.data.frame(as.matrix(mydtm)) )
步骤4:合并原数据框与DTM数据
根据你的需求,有两种合并方式可选:
方式A:保留所有原推文(含空文档)
如果需要保留原数据框的44159行,空文档对应的DTM列填充为NA,用左连接即可:
library(dplyr) final_dataset <- left_join(ngram.features.df, dtm_with_id, by = "ID")
方式B:仅保留非空文档(行数完全匹配)
如果只需要后续建模用到的非空推文,直接合并过滤后的原数据框和DTM就行:
# 过滤原数据框,仅保留非空文档的行 filtered_ngram_df <- ngram.features.df[keep_indices, ] # 合并(行数一致且顺序完全对应,直接绑定即可) final_dataset <- cbind(filtered_ngram_df, as.data.frame(as.matrix(mydtm)))
这样处理后,你就能得到带原推文ID、可直接用于分类和主题建模的最终数据集了。
内容的提问来源于stack exchange,提问作者knightmiklotov
相关产品推荐
相关产品推荐

