目前正在参与MOOC并尝试一些情绪分析,但是在使用R代码时遇到了问题。
我所拥有的是一系列坏词和一系列好词。例如,我的坏话是c(“凹痕”,“破损”,“磨损”,“破裂”等)等。
我的数据框中有一个描述列表,我想要做的是计算我的错误单词出现在列表中的数量以及每行显示的好词数。
例如,假设这是我的数据框desc = c("this screen is cracked", "minor dents and scratches", "100% good", "in perfect condition")
id = c(1,2,3,4)
df = data.frame(id, desc)
bad.words = c("cracked", "scratches", "dents")
我想要的是制作一个总和列,用于计算每个坏词在描述中出现的频率
所以希望我的最终df看起来像
id desc sum
1 "this screen is cracked" 1
2 "minor dents and scratches" 2
3 "100% good" 0
4 "in perfect condition" 0
到目前为止我所拥有的是
df$sum <- grepl(paste( bad.words, collapse="|"), df$desc)
如果出现一个单词,只会给我一个真或假
答案 0 :(得分:3)
如果您找到一笔金额,vapply()
比sapply()
更合适。你可以做到
library(stringi)
df$sum <- vapply(df$desc, function(x) sum(stri_count_fixed(x, bad.words)), 1L)
哪个给出了
df
# id desc sum
# 1 1 this screen is cracked 1
# 2 2 minor dents and scratches 2
# 3 3 100% good 0
# 4 4 in perfect condition 0
答案 1 :(得分:1)
因为您可能会尝试不同的单词列表,例如good.words,bad.words,really.bad.words;我会写一个函数。我喜欢lapply,但vapply和其他人也会工作。
countwords <- function(x,comparison){
lapply(x,function(x,comparewords){
sum(strsplit(x,' ')[[1]] %in% comparewords)
},comparewords = comparison)
}
df$good <- countwords(df$desc,good.words)
df$bad <- countwords(df$desc,bad.words)
在您学习并转向生产速度后,tm包也很有用。