2016-07-28 68 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