问题描述
我正在尝试基于 1-gram(可以通过更改下面代码中的 n 将其扩展为 n-gram)频率聚合数据帧并将其他列与其关联。我这样做的方式如下所示。是否有任何其他快捷方式/替代方法可以为下面给出的数据框生成此问题最后显示的表格?
代码和结果如下所示。
以下块设置环境,加载库并读取数据帧:
# Clear variables in the working environment
rm(list = ls(all.names = TRUE))
gc()
# load libraries
library("quanteda")
library("data.table")
library("tidyverse")
# Dataframe
Data <- data.frame(Column1 = c(1.222,3.445,5.621,8.501,9.302),Column2 = c(654231,12347,-2365,90000,12897),Column3 = c('A1','B2','E3','C1','F5'),Column4 = c('I bought it','The flower has a beautiful fragrance','It was bought by me','I have bought it','The flower smells good'),Column5 = c('Good','Bad','Ok','Moderate','Perfect'))
接下来计算语料库、标记化和 n-gram(在本例中为 1-gram/unigram/onegram):
# Corpus
Content <- corpus(Data,text_field = "Column4")
docnames(Content) <- seq_len(nrow(Data))
# Tokenization and Unigram
Tokens <- tokens(Content,what = "word") %>% tokens_tolower() %>% tokens_ngrams(n = 1)
Unigram <- textstat_frequency(dfm(Tokens),groups = docnames(Tokens)) %>% as.data.table()
setnames(Unigram,"group","rownumber")
Unigram 结果是:
下面给出了与 Unigram 相关的结构:
str(Unigram)
接下来,将Data复制到DataFrame,在其中添加rownumber作为变量,并将该变量设置为数字:
DataFrame <- Data
DataFrame <- add_column(DataFrame,rownumber = 1:nrow(Data),.before = "Column1")
DataFrame$rownumber <- as.numeric(DataFrame$rownumber)
然后将 Unigram 转换为数据帧(UnigramDataFrame),在其中设置 rownumber 为数字,然后将 UnigramDataFrame 与 DataFrame 合并:
UnigramDataFrame <- as.data.frame(Unigram)
UnigramDataFrame$rownumber <- as.numeric(UnigramDataFrame$rownumber)
MergeDF <- dplyr::left_join(UnigramDataFrame,DataFrame,by="rownumber")
最后聚合 1-gram/unigram 频率的 MergeDF(它的第一列),并将 Column3 和 Column5 与其关联:
UnigramAgg <- MergeDF %>% group_by(feature) %>% summarise(Freq=n(),Column3=toString(Column3),Column5=toString(Column5))
运行上面产生了想要的结果:
目的是按其频率聚合 1-gram,并将第 3 列和第 5 列与其关联,如上所示。最后两列显示了与此聚合的 Column3 和 Column5 相关联的条目是什么。例如,所有的 ID(识别号)都可以通过这种方式与每 1-gram 关联起来。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)