celestialgod

parse irregular data

Apr 30th, 2016
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 3.12 KB | None | 0 0
  1. # (library後面註解是該套件會用到的函數)
  2. library(data.table) # fread, data.table, setnames
  3. library(pipeR)      # %>>%
  4. library(plyr)       # rlply
  5. library(dplyr)      # mutate
  6. library(stringr)    # str_replace_all, str_c    
  7.  
  8. readLines(textConnection('sam 18; boy
  9. paul; 20 boy
  10. charlotte; 21; girl
  11. christy 17 girl')) %>>%
  12.   str_replace_all("([a-zA-Z0-9]);? ", "\\1,") %>>%
  13.   # str_replace_all比gsub適合用在pipeR
  14.   str_c(collapse = "\n") %>>% fread %>>% # str_c = paste
  15.   setnames(c("name", "age", "sex")) %>>%
  16.   mutate(age = as.integer(age))
  17. #        name age  sex
  18. # 1       sam  18  boy
  19. # 2      paul  20  boy
  20. # 3 charlotte  21 girl
  21. # 4   christy  17 girl
  22.  
  23. # 用兩百萬個row測試看看:
  24. # data generation
  25. textData <- raply(5e5, 'sam 18; boy
  26. paul; 20 boy
  27. charlotte; 21; girl
  28. christy 17 girl') %>>% str_c(collapse = "\n")
  29.  
  30. library(microbenchmark)
  31. microbenchmark(test = textData %>>% str_replace_all("([a-zA-Z0-9]);? ", "\\1,") %>>%
  32.                  # str_replace_all比gsub適合用在pipeR
  33.                  str_c(collapse = "\n") %>>% fread %>>% # str_c = paste
  34.                  setnames(c("name", "age", "sex")) %>>%
  35.                  mutate(age = as.integer(age)), times = 10L)
  36. # Unit: seconds
  37. # expr      min       lq     mean   median       uq      max neval
  38. # test 4.489137 4.520529 4.528179 4.529275 4.543055 4.557189    10
  39.  
  40. # 平均一次4.5秒左右,全距也很小,所以兩百萬列不是問題
  41.  
  42.  
  43.  
  44. pattern <- str_c("([a-z]*);?\\s*", "(\\d*)?;?\\s*", "(boy|girl)?;?\\s*",
  45.                  "(\\d{4}:\\d{2}:\\d{2}:\\d{2})?")
  46. # 第一個是第一欄位,第二個是第二欄位,依此類推
  47. readLines(textConnection('sam;16;boy; 2015:00:09:59
  48. green;18;girl;
  49. paul;20; 2015:00:09:59
  50. charlotte; 21;')) %>>% str_replace_all(pattern, "\\1, \\2, \\3, \\4") %>>%
  51.   str_replace_all(", , , ", "") %>>% str_c(collapse = "\n") %>>%
  52.   fread(na.string="") %>>% setnames(c("name", "age", "sex", "time")) %>>%
  53.   mutate(age = as.integer(age))
  54. # name age  sex          time
  55. # 1       sam  16  boy 2015:00:09:59
  56. # 2     green  18 girl          <NA>
  57. # 3      paul  20 <NA> 2015:00:09:59
  58. # 4 charlotte  21 <NA>          <NA>
  59.  
  60. # 這裡要為什麼要取代", , , ",我暫時想不出來為什麼
  61. # 這裡不知道為什麼經過regex後,每一列會多出三個逗號,讓我匪夷所思QQ
  62.  
  63. # 用兩百萬個row測試看看:
  64. # data generation  
  65. textData <- raply(5e5, 'sam;16;boy; 2015:00:09:59
  66. green;18;girl;
  67. paul;20; 2015:00:09:59
  68. charlotte; 21;') %>>% str_c(collapse = "\n")
  69.  
  70. library(microbenchmark)
  71. microbenchmark(test = readLines(textConnection(textData)) %>>%
  72.                  str_replace_all(pattern, "\\1, \\2, \\3, \\4") %>>%
  73.                  str_replace_all(", , , ", "") %>>% str_c(collapse = "\n") %>>%
  74.                  fread(na.string="") %>>% setnames(c("name", "age", "sex", "time")) %>>%
  75.                  mutate(age = as.integer(age)), times = 10L)
  76. # Unit: seconds
  77. # expr      min      lq    mean   median       uq      max neval
  78. # test 10.93214 10.9493 10.9683 10.96072 10.98294 11.04314    10
  79.  
  80. # 平均一次11秒左右,全距也很小,所以兩百萬列不是問題
Advertisement
Add Comment
Please, Sign In to add comment