Есть ли способ заменить петли в г - PullRequest
1 голос
/ 01 апреля 2020

У меня есть 2 . Один с 4000 (EPM_CODES) элементами, а другой с 400000 (df) элементами.

Я пытаюсь выяснить количество вхождений EPM_CODE в df. У меня есть следующий код, который работает. Но заняло 4 часа. Есть ли более быстрый способ выполнить sh эту задачу?

Ваша помощь приветствуется.

Ниже приведен код, который у меня есть:

for (EPM_CODE in EPM_Codes$`EPM Application Code`){
  COUNT_OF_OCCURENCES <- nrow(as.data.frame(df$ELEMENT_ATTRIBUTES[grepl(paste0(",",EPM_CODE), df$ELEMENT_ATTRIBUTES) | grepl(paste0('"',EPM_CODE), df$ELEMENT_ATTRIBUTES) | grepl(paste0('_',EPM_CODE), df$ELEMENT_ATTRIBUTES) ]))
  result <- cbind(EPM_CODE,COUNT_OF_OCCURENCES)
  Final <- rbind(Final,result)
  #print(Final)
}

Благодарим Вас за помощь .

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Опираясь на ответ @ Sathi sh, мы можем использовать объединение в data.table, чтобы избавить от необходимости делать копию.

library(data.table)
setDT(EPM_CODES)
EPM_CODES[unique(EPM_CODES[,.(`EPM Application Code`)]),.N,on = 'EPM Application Code', by = 'EPM Application Code']
#      EPM Application Code   N
#   1:           XYTRN6637W 115
#   2:           VHNNR8661H  89
#   3:           KJSSN2069O  98
#  ---                         
#3998:           QQAHP4035A  96
#3999:           EHMBU6110N 114
#4000:           MAWLD3865R  94

Обратите внимание на небольшую разницу между `и 'выше.

Данные @ Sathi sh.

set.seed(2L)
EPM_CODES <- myFun(4000)
EPM_CODES <- data.frame( x = sample(EPM_CODES, 400000, replace = TRUE))
setDT(EPM_CODES)
EPM_CODES[,Value := sample(1:5,nrow(EPM_CODES),replace = TRUE)]
setnames(EPM_CODES,"x","EPM Application Code")
1 голос
/ 01 апреля 2020

Данные:

Адаптировано с { ссылка }

myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
set.seed(2L)
EPM_CODES <- myFun(4000)
df <- data.frame( x = sample(EPM_CODES, 400000, replace = TRUE))

Код:

Адаптировано с { ссылка }

library('data.table')
setDT(df)[x %in% EPM_CODES, .N, keyby=x]

#             x   N
# 1: AADIP7357E 106
# 2: AAIQS2844S 101
# 3: AAMIJ4546E 104
# 4: AARRM3046V  98
# 5: AAVHW9261Y  94
# ---               
# 3996: ZZLCN5345R  82
# 3997: ZZUKM1348P  85
# 3998: ZZUOU5109E  99
# 3999: ZZUYE3207T  96
# 4000: ZZYEU6750J 115


system.time({ setDT(df)[x %in% EPM_CODES, .N, keyby=x] })
   user  system elapsed 
   0.09    0.00    0.09 
...