celestialgod

column search by id

Jul 20th, 2015
530
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 2.37 KB | None | 0 0
  1. library(data.table)
  2. library(tidyr)
  3. library(dplyr)
  4. library(magrittr)
  5. N = 1e5
  6. dat = data.table(ID = paste0("P", 1:N))
  7. for (i in 1:50)
  8.   eval(parse(text = paste0("dat %<>% mutate(D", i,
  9.     "=paste0(sample(LETTERS, N, TRUE),",
  10.     "sample(as.character(1:100), N, TRUE)))")))
  11.  
  12. # single search
  13. code1 = "D5"
  14. st = proc.time()
  15. a = dat %>% gather(D, code, -ID) %>% group_by(ID) %>%
  16.   summarise(stroke = any(code == code1)) %>% distinct()
  17. proc.time() - st
  18. #   user  system elapsed
  19. #   0.42    0.05    0.47
  20.  
  21. # multiple search
  22. codes_search = c("D5", "E55", "Z2", "A96")
  23. st = proc.time()
  24. a = dat %>% gather(D, code, -ID) %>% group_by(ID)
  25. for (i in 1:length(codes_search))
  26.   eval(parse(text = paste0("a %<>% mutate(codes_search_", i,
  27.     "=codes_search[", i, "])")))
  28. b = a %>% group_by(ID) %>% summarise_(.dots = paste0(
  29.     "any(code == codes_search_", 1:length(codes_search),")")) %>%
  30.   setnames(c("ID", paste0("stroke", 1:length(codes_search))))
  31. proc.time() - st
  32. #   user  system elapsed
  33. #   2.74    0.26    3.01
  34.  
  35. ## list search
  36. diseases = vector('list', 15)
  37. for (i in 1:length(diseases))
  38.   diseases[[i]] = paste0(sample(LETTERS, i, TRUE),
  39.     sample(1:100, i, TRUE))
  40.  
  41. st = proc.time()
  42. a = dat %>% gather(D, code, -ID) %>% group_by(ID)
  43. out_list = llply(1:length(diseases), function(i){
  44.   a %>% setkey(ID) %>% group_by(ID) %>%
  45.   summarise(stroke = any(code %in% diseases[[i]])) %>%
  46.   setnames("stroke", paste0("stroke_", i))
  47. })
  48. out = Reduce(function(x, y) merge(x, y), out_list)
  49. proc.time() - st
  50. #   user  system elapsed
  51. #   8.88    0.36    9.23
  52.  
  53. ## faster way
  54. st = proc.time()
  55. a = dat %>% gather(D, code, -ID) %>% group_by(ID)
  56. eval(parse(text = paste("a %<>% summarise(", paste0("stroke_",
  57.   1:length(diseases) ,"=any(diseases[[", 1:length(diseases),
  58.   "]] %in% code)", collapse = ","), ")")))
  59. proc.time() - st
  60. #   user  system elapsed
  61. #   5.79    0.05    5.85
  62.  
  63. ## the fastest way
  64. st = proc.time()
  65. out2 = vector('list', length(diseases))
  66. for (i in 1:length(diseases))
  67.   out2[[i]] = rowMeans(sweep(as.matrix(dat[,2:51, with = FALSE]), 2, 1:(ncol(dat)-1), function(x, y){matrix(x %in% diseases[[i]], nrow(dat))})) > 0
  68. out2 = do.call(cbind, out2) %>% data.table %>% cbind(dat$ID, .) %>%
  69.   setnames(c("ID", paste0("stroke_", 1:length(diseases)))) %>% tbl_dt(FALSE)
  70. proc.time() - st
  71. #   user  system elapsed
  72. #   3.20    0.52    3.71
  73.  
  74. all.equal(out2, a) # TRUE
Advertisement
Add Comment
Please, Sign In to add comment