在R中分组总和的最快方法

时间:2016-04-26 10:37:19

标签: r string text

输入

DF1

colA           colB
23            google
3423    google facebook
234          facebook
45654         myspace

DF2

colA    colB    colC                                      colD
176393  177410  I use google                                1
903051  566590  I don't use google                          2
833826  783799  He ilksdfjs google facebook in kjhfkjdhf    3
61633   724094  I don't like facebook                       4
201540  422083  ahsfhds alsjkd fioawe myspace               5
847378  238557  kjsgjkf google                              6
766361  991353  ldkfjslj skjfv facebook                     7
924458  132127  dlkfjsflk slkdf lsisre snfh google          8
67391   267390  slkjfalj myspace                            9
600908  908724  dlfkj myspace google facebook               10

输出中级

colA        colB               output col
23          google             1+2+3+6+8+10
3423        google facebook    3+10
234         facebook           3+4+7+10
45654       myspace            5+9+10

输出df1

colA         colB             output col
23           google             30
3423         google facebook    13
234          facebook           24
45654        myspace            24

目前我正在使用:

df1$output_col <-sapply(df1$colB,function(x)sum(df2$colD[grepl(paste0("\\b",x,"\\b"), df2$colD)]))

它给了我想要的输出,但同时又花了太多时间。我有一个相当大的数据集,需要减少运行时间。

请提供优化方式,如果有的话。

1 个答案:

答案 0 :(得分:1)

您是否熟悉ddply packageplyr功能?它允许您创建聚合信息的数据帧,例如您可以合并两个数据帧作为预处理步骤,然后执行

ddply(new_dataframe, .(colA,colB), summarize, output = sum(colD))

<强>更新

步骤:

df2$colC = as.character(df2$colC)
df2$term = regmatches(df2$colC,regexpr("google| google facebook|facebook|myspace",df2$colC))
ddply(df2,.(term), summarize,output =sum(colD))

只需查找通用正则表达式表达式即可使用levels(df1$colC)

中的所有值