2016-07-28 69 views
0

我有一个包含列“agency_lookup”一“Agency_Reference”表中,对字符串的200个条目,如下:优化回路功能

  1. 阿尔法
  2. 测试
  3. 伽马等等。

我有一个数据帧“TEST”包含的条目,如“运动”列一百万行:

  1. Alpha_xt2010
  2. alpha_xt2014
  3. Beta_xt2016等。

我通过在引用表中的每个条目要循环,发现这串是每个广告系列列条目中存在,并创建一个新的agency_identifier列在表中变量。

我目前的代码如下,执行速度很慢。请求如何优化相同的指导。我想了解如何做到这一点的data.table方式

Agency_Reference <- data.frame(agency_lookup = c('alpha','beta','gamma','delta','zeta')) 
TEST <- data.frame(Campaign = c('alpha_xt123','ALPHA345','Beta_xyz_34','BETa_testing','code_delta_')) 
TEST$agency_identifier <- 0 
for (agency_lookup in as.vector(Agency_Reference$agency_lookup)) { 
TEST$Agency_identifier <- ifelse(grepl(tolower(agency_lookup), tolower(TEST$Campaign)),agency_lookup,TEST$Agency_identifier)} 

预期输出:

活动---- Agency_identifier

alpha_xt123 ---阿尔法

ALPHA34- --- alpha

Beta_xyz_34 ---- beta

BETa_testing ---- be TA

code_delta _-----三角洲

+0

请出示一个小重复的例子,并且预期输出 – akrun

+0

@akrun:我已经发布了最初的代码,有错误。因此编辑了代码以显示我当前使用的实际代码。请让我知道是否需要其他信息,以帮助查询。 –

+0

你的代码特别给出了错误。 'for'循环。什么是预期的输出 – akrun

回答

1

尝试

TEST <- data.frame(Campaign = c('alpha_xt123','ALPHA345','Beta_xyz_34','BETa_testing','code_delta_')) 

pattern = tolower(c('alpha','Beta','gamma','delta','zeta')) 

TEST$agency_identifier <- sub(pattern = paste0('.*(', paste(pattern, collapse = '|'), ').*'), 
           replacement = '\\1', 
           x = tolower(TEST$Campaign)) 
0

这不会回答你的问题本身,而是从我的理解,你想仔细的Campaign列,并用它做提供价值的东西。

看看Tidy data,更具体地说是“存储在一列中的多个变量”部分。我想你会用tidyr::separate取得很大的进步。这样你不必使用for -loop。

+0

谢谢贾斯珀。但是,广告系列专栏的格式并不像我在示例中给出的那样标准。因此我被迫使用grepl。 –

+0

一般来说,这种事情比回答更好。 – Frank