在R中按模式分组数据帧

在R中按模式分组数据帧,r,pattern-matching,aggregate,R,Pattern Matching,Aggregate,我有一个包含数百行的R数据帧 word Freq seed 4 seeds 3 contract 2 contracting 2 river 1 我想按模式对数据进行分组,比如种子+种子。。。看起来像 word Freq seed 7 contract 4 river 1 一个选项是通过基于“word”中的最小字符数提取子字符串来创建分组变量“gr”,再使用“word”sp执行一次,这样我们可以获

我有一个包含数百行的R数据帧

word        Freq
seed         4
seeds        3
contract     2
contracting  2
river        1
我想按模式对数据进行分组,比如种子+种子。。。看起来像

word     Freq
seed      7
contract  4
river     1

一个选项是通过基于“word”中的最小字符数提取子字符串来创建分组变量“gr”,再使用“word”sp执行一次,这样我们可以获得每组单词的子字符串,然后通过“word”获得“Freq”的

library(dplyr)
 df1 %>% 
    group_by(gr= substr(word, 1, min(nchar(word)))) %>%
    group_by(word= substr(word, 1, min(nchar(word)))) %>%
    summarise(Freq= sum(Freq)) 
    word  Freq
#      (chr) (int)
#1 contract     4
#2    river     1
#3     seed     7

也可以使用交叉连接,这比上述方法安全一点

library(dplyr)
library(stringi)

df %>%
  merge(df %>% select(short_word = word) ) %>%
  filter(short_word %>%
           stri_detect_regex(word, .) ) %>%
  group_by(word) %>%
  slice(short_word %>% stri_length %>% which.min) %>%
  group_by(short_word) %>%
  summarise(Freq= sum(Freq)) 

这里可能还有另一条路要走。在
SnowballC
包中,有一个函数可以清理单词并获取词干(即
wordStem()
)。我认为,使用它,您可以跳过字符串操作。一旦你们完成了这个过程,你们要做的就是得到词频的总和

library(SnowballC)
library(dplyr)

mydf <- read.table(text = "word        Freq
seed         4
seeds        3
contract     2
contracting  2
river        1", header = T)

mutate(mydf, word = wordStem(word)) %>%
group_by(word) %>%
summarise(total = sum(Freq))

#      word total
#     (chr) (int)
#1 contract     4
#2    river     1
#3     seed     7
库(SnowballC)
图书馆(dplyr)
多年筹资框架%
分组依据(字)%>%
总结(总计=总和(频率))
#总字数
#(chr)(内部)
#1合同4
#2河1
#3种子7

尝试使用
adist
匹配术语

dat$grp <- seq(nrow(dat))

# generate a matrix comparing the vector of words to themselves
tmp <- adist(dat$word, dat$word, partial=TRUE)
diag(tmp) <- Inf
dat$grp[col(tmp)[tmp==0]] <- row(tmp)[tmp==0]

final <- aggregate(Freq ~ grp, data=dat, sum)
final$word <- dat$word[match(final$grp, dat$grp)]

#  grp Freq     word
#1   1    7     seed
#2   3    4 contract
#3   5    1    river

dat$grp我不确定是否有一个帖子可以满足您的所有需求,但有几个帖子可以组合起来解决您的问题。例如,查看上的这篇文章和上的这篇文章。此外,包括将改善你的职位。如前所述,您有一个广泛的问题。是的,您已经看到了,但是有很多函数可以实现这一点。我也没有得到预期的输出。我必须说,
wordStem()
很不错badass@RichardScriven呵呵,是啊!
dat <- data.frame(word=c("seed","seeds","contract","contracting","river"),Freq=c(4,3,2,2,1))