基于两个相似数据帧的单词总和

时间:2017-03-24 04:50:43

标签: r

我知道聚合是获取相同内容/单词的方法,但如果它们在两个数据帧中分开则会发生什么。我有一个相当复杂的数据框,但我将在下面简化它只是为了解决核心问题。

让我们说数据框都在

之下

D1:

word freq  
beaten 1  
pizza 120   
test 5 

D2:

word freq  
beaten 2  
pizza 65
test 3

如何实现以下目标?

结果:

word freq    
beaten 1/(1+2)    
pizza 120/(65+120)    
test 5/(5+3)

提前致谢

2 个答案:

答案 0 :(得分:0)

我们可以使用mergeword合并两个数据框,然后将freq的每个D1列除以freq中的D1之和1}}和D2

df <- merge(D1, D2, by="word")
result <- data.frame(df[1], freq = df$freq.x/rowSums(df[-1]))
result

#    word      freq
#1 beaten 0.3333333
#2  pizza 0.6486486
#3   test 0.6250000

如果wordD1 D2订单相同,我们可以直接使用

data.frame(D[1], freq = D1$freq/(D1$freq + D2$freq))

答案 1 :(得分:0)

我们可以通过rbind两个数据集以更简单的方式完成此操作,按照&#39; word&#39;分组,得到&#39; freq&#39;的第一个元素的比率。使用&{39; freq&#39;

sum
library(data.table)
rbindlist(list(D1, D2))[, .(freq= freq[1]/sum(freq)), word]
#    word      freq
#1: beaten 0.3333333
#2:  pizza 0.6486486
#3:   test 0.6250000

tidyverse

library(dplyr)
bind_rows(D1, D2) %>%
          group_by(word) %>%
          summarise(freq = first(freq)/sum(freq))
# A tibble: 3 × 2
#    word      freq
#    <chr>     <dbl>
#1 beaten 0.3333333
#2  pizza 0.6486486
#3   test 0.6250000

或使用aggregate中的base R使用类似的方法

aggregate(freq~word, rbind(D1, D2), function(x) x[1]/sum(x))