colA colB
23 google
3423 google facebook
234 facebook
45654 myspace
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
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)]))
它给了我想要的输出,但同时又花了太多时间。我有一个相当大的数据集,需要减少运行时间。
请提供优化方式,如果有的话。
答案 0 :(得分:1)
您是否熟悉ddply
package的plyr
功能?它允许您创建聚合信息的数据帧,例如您可以合并两个数据帧作为预处理步骤,然后执行
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)