简体   繁体   English

具有for循环功能的R Data.table组合的优化

[英]Optimization of R Data.table combination with for loop function

I have a 'Agency_Reference' table containing column 'agency_lookup', with 200 entries of strings as below : 我有一个“ Agency_Reference”表,其中包含“ agency_lookup”列,其中包含200个字符串条目,如下所示:

  1. alpha α
  2. beta 贝塔
  3. gamma etc.. 伽玛等

I have a dataframe 'TEST' with a million rows containing a 'Campaign' column with entries such as : 我有一个数据框“ TEST”,其中包含一百万行,其中包含“ Campaign”列,其中包含以下条目:

  1. Alpha_xt2010 Alpha_xt2010
  2. alpha_xt2014 alpha_xt2014
  3. Beta_xt2016 etc.. Beta_xt2016等。

i want to loop through for each entry in reference table and find which string is present within each campaign column entries and create a new agency_identifier column variable in table. 我想遍历参考表中的每个条目,并找到每个广告系列列条目中存在的字符串,并在表中创建一个新的agency_identifier列变量。

my current code is as below and is slow to execute. 我当前的代码如下,执行起来很慢。 Requesting guidance on how to optimize the same. 请求有关如何进行优化的指南。 I would like to learn how to do it in the data.table way 我想学习如何以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)}

Expected Output : 预期产量:

Campaign----Agency_identifier 广告活动---- Agency_identifier

alpha_xt123---alpha alpha_xt123 --- alpha

ALPHA34----alpha ALPHA34 ----阿尔法

Beta_xyz_34----beta Beta_xyz_34 ---- beta

BETa_testing----beta BETa_testing ----测试版

code_delta_-----delta code_delta _-----三角洲

Try 尝试

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))

This will not answer your question per se, but from what I understand you want to dissect the Campaign column and do something with the values it provides. 这本身并不能回答您的问题,但是据我了解,您希望剖析“ Campaign列,并使用其提供的值进行处理。

Take a look at Tidy data , more specifically the part "Multiple variables stored in one column". 看一下Tidy数据 ,更具体地说是“在一个列中存储多个变量”部分。 I think you'll make some great progress using tidyr::separate . 我认为您将使用tidyr::separate取得很大的进步。 That way you don't have to use a for -loop. 这样,您不必使用for -loop。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM