根据重复行添加频率

Rya*_*yan 3 r

我有一个数据帧, dd

     Var1 Freq
76   2189- 1181
458  6186-  813
445  6170-  738
902  61801  650
74   2181-  618
504  6268-  509
905  61804  307
500  6259-  272
910  61889  265
495  6253-  242
73   2180-  224
510  6256- 6407
461  6180- 3254
792        2333
1          2312
467  6186- 2259
212  4019- 1254
4561 6170- 1162
462  6181- 1156
80   2189- 1154
465  6184- 1035
Run Code Online (Sandbox Code Playgroud)

我想在Var1列中搜索重复项并将它们组合起来,在列中创建一个频率之和,Freq以便......

     Var1 Freq
76   2189- 2335
458  6186- 3072
445  6170- 1900
902  61801  650
74   2181-  618
504  6268-  509
905  61804  307
500  6259-  272
910  61889  265
495  6253-  242
73   2180-  224
510  6256- 6407
461  6180- 3254
792        2333
1          2312
212  4019- 1254
462  6181- 1156
465  6184- 1035
Run Code Online (Sandbox Code Playgroud)

注:所以你不必去寻找差异,在Var1合并值分别为2189-,6186-,和6170-.

我想这可以用一些花哨的工作来完成[]duplicated(),但我似乎无法环绕它我的头.我很感激任何指导.

dput此数据可以在引擎收录发现.

Dav*_*urg 5

这可以简单地完成

aggregate(Freq ~ Var1, dd, sum)
Run Code Online (Sandbox Code Playgroud)

或者 data.table

library(data.table)
setDT(dd)[, .(Freq = sum(Freq)), by = Var1]
Run Code Online (Sandbox Code Playgroud)

或者 dplyr

library(dplyr)
dd %>%
  group_by(Var1) %>%
  summarise(Freq = sum(Freq))
Run Code Online (Sandbox Code Playgroud)

虽然这也会将空条目加起来"",但不清楚为什么要区别对待它们

无论哪种方式,使用data.table您都可以达到您的确切输出

setDT(dd)[, if(Var1 == "") .SD else sum(Freq), by = Var1]
#      Var1   V1
#  1: 2189- 2335
#  2: 6186- 3072
#  3: 6170- 1900
#  4: 61801  650
#  5: 2181-  618
#  6: 6268-  509
#  7: 61804  307
#  8: 6259-  272
#  9: 61889  265
# 10: 6253-  242
# 11: 2180-  224
# 12: 6256- 6407
# 13: 6180- 3254
# 14:       2333
# 15:       2312
# 16: 4019- 1254
# 17: 6181- 1156
# 18: 6184- 1035
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@ david-arenburg.不同地对待""只是一种疏忽.多么简单的解决方案. (2认同)
  • @DavidArenburg刚才看到了OP的评论.是的,很难看.我希望`总结'更灵活一点 (2认同)