按R中的模式对数据进行分组

时间:2015-10-26 02:02:00

标签: 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

4 个答案:

答案 0 :(得分:3)

这可能是另一种方式。在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

答案 1 :(得分:1)

一种选择是创建一个分组变量&#39; gr&#39;通过根据&#39; word&#39;中的最小字符数提取子字符串,再用#39; word&#39; sp我们可以得到每组单词的子字符串,然后得到sum的&#39; Freq&#39;通过&#39; word&#39;。

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

答案 2 :(得分:1)

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

2015-10-23T03:34:40

答案 3 :(得分:1)

尝试使用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 <- data.frame(word=c("seed","seeds","contract","contracting","river"),Freq=c(4,3,2,2,1))