使用inner_join()结合AFINN词典后结果行数超词典的原因咨询
问题拆解与解决方案
嘿,我来帮你理清这两个常见的R数据处理误区~
1. 为什么inner_join结果行数远超AFINN词典行数?
核心原因是你混淆了唯一单词数和单词总出现次数:
- AFINN词典的2477行代表的是2477个唯一的情感单词,每个单词只在词典里记录一次(比如"happy"在词典里只有1行)。
- 而你的《傲慢与偏见》数据框中,这些情感单词可能重复出现很多次(比如"happy"在小说里可能出现了20次)。
inner_join()会把原文中每一次出现的匹配单词都和词典条目合并,所以最终的6065行是原文中所有属于AFINN词典的单词的总出现次数,而不是不同单词的数量。
你可以用下面的代码验证这个逻辑:
# 统计结果中唯一的情感单词数量(应该≤2477) length(unique(afinn_sentiments$word)) # 统计AFINN词典中每个单词在原文里的出现次数 afinn_sentiments %>% count(word, sort = TRUE)
2. 为什么你的filter代码返回全部6065行?
你的代码逻辑犯了一个小细节错误:
afinn_sentiments %>% filter(!word %in% afinn)
这里的afinn是整个AFINN词典数据框,但%in%需要对比的是字符向量(也就是词典里的单词列)。当你用字符类型的word去和数据框afinn做匹配时,结果永远是FALSE(字符不可能属于一个数据框),所以!FALSE就是TRUE,所有行都会被保留,自然返回6065行。
修正后的代码应该提取AFINN词典的单词列再做对比:
# 假设你的AFINN词典数据框名为afinn,先提取单词列 afinn_word_list <- afinn$word # 再过滤(正常来说inner_join后的结果应该没有不在词典里的单词,所以这个过滤会返回0行) afinn_sentiments %>% filter(!word %in% afinn_word_list)
内容的提问来源于stack exchange,提问作者Ryan Ma
相关产品推荐
相关产品推荐

