2015-10-26 99 views
2

圖案框架我有數百個行的R數據幀作爲組數據由R中

word  Freq 
seed   4 
seeds  3 
contract  2 
contracting 2 
river  1 

我想組由圖案數據,表示種子+種籽,看起來像

word  Freq 
seed  7 
contract 4 
river  1 
+0

我不知道有上,這樣做你想要的一切一個職位,但有幾個,你可以放在一起解決您的問題。例如,查看[模式匹配](http://stackoverflow.com/questions/20219311/pattern-matching-and-replacement-in-r)上的這篇文章以及[摘要函數](http: //stackoverflow.com/questions/9847054/how-to-get-summary-statistics-by-group)。此外,包括[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)會改善你的帖子。正如所寫,你有一個廣泛的問題。 –

回答

1

一種選擇是通過基於'word'中最小字符數提取子字符串來創建一個分組變量'gr',用'word'sp來做這一個,我們可以得到每個組的子字符串單詞,然後通過'單詞'獲得'Freq'的sum

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 
1

也可以用交叉連接,這比上面的方法有點安全。

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)) 
+0

是的,已經看到了,但很多功能來獲得這個權利。 – akrun

+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

我得說,'wordStem()'很可惡 –

+0

@RichardScriven呵呵,是的! – jazzurro

+0

好的方法,學會了一些新的東西。 – akrun

0

嘗試使用adist來匹配條件up。

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))