celestialgod

by row unique

Sep 13th, 2017
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 2.50 KB | None | 0 0
  1. library(data.table)
  2. library(pipeR)
  3.  
  4. # data generation
  5. numRows <- 3e4
  6. numCols <- 8
  7. s <- matrix(NA_integer_, numRows, numCols)
  8. idx <- sample(numCols, numRows, TRUE)
  9. for (i in 1:numCols)
  10.   s[idx == i, 1:i] <- sample(42, i * sum(idx == i), TRUE)
  11.  
  12. time <- seq(ISOdate(2017, 9, 12) - numRows*3600, ISOdate(2017, 9, 12),
  13.             by = "hour")
  14. DT <- data.table(time = head(time, numRows), s)
  15. #                       time V1 V2 V3 V4 V5 V6 V7 V8
  16. #     1: 2014-04-11 12:00:00 33 18  2 NA NA NA NA NA
  17. #     2: 2014-04-11 13:00:00 19 NA NA NA NA NA NA NA
  18. #     3: 2014-04-11 14:00:00 40 30 NA NA NA NA NA NA
  19. #     4: 2014-04-11 15:00:00 39  4 18 19 NA NA NA NA
  20. #     5: 2014-04-11 16:00:00 29 31 14  3 24 34 25  8
  21. #   ---
  22. # 29996: 2017-09-12 07:00:00 13 22 NA NA NA NA NA NA
  23. # 29997: 2017-09-12 08:00:00 31 42 NA NA NA NA NA NA
  24. # 29998: 2017-09-12 09:00:00 16 NA NA NA NA NA NA NA
  25. # 29999: 2017-09-12 10:00:00  7 23 27 16 21 NA NA NA
  26. # 30000: 2017-09-12 11:00:00 10 28 22 14 31 NA NA NA
  27.  
  28. # 主程式
  29. # 第一個問題
  30. st <- proc.time()
  31. melt(DT, 1, 2:9) %>>% na.omit("value") %>>%
  32.   `[`(j = .(value = unique(value), idx = 1:uniqueN(value)), by = .(time)) %>>%
  33.   dcast(time ~ idx, value.var = "value")
  34. proc.time() - st
  35. # user  system elapsed
  36. # 0.68    0.00    0.71
  37. #                       time  1  2  3  4  5  6  7  8
  38. #     1: 2014-04-11 12:00:00 31 NA NA NA NA NA NA NA
  39. #     2: 2014-04-11 13:00:00 40  4 30  8 21 25  3 11
  40. #     3: 2014-04-11 14:00:00  7 35 33 NA NA NA NA NA
  41. #     4: 2014-04-11 15:00:00 28 34 35  8 32 NA NA NA
  42. #     5: 2014-04-11 16:00:00  6 10  4 18 20 19 41 NA
  43. #    ---
  44. # 29996: 2017-09-12 07:00:00 24 13 39  6 36 35 31 29
  45. # 29997: 2017-09-12 08:00:00  6 27 29 NA NA NA NA NA
  46. # 29998: 2017-09-12 09:00:00 16 NA NA NA NA NA NA NA
  47. # 29999: 2017-09-12 10:00:00 23 15 17  1  5 NA NA NA
  48. # 30000: 2017-09-12 11:00:00  6 33 NA NA NA NA NA NA
  49.  
  50. # 第二個問題
  51.  
  52. st <- proc.time()
  53. melt(DT, 1, 2:9) %>>% na.omit("value") %>>%
  54.   `[`(j = .(cnt = .N), by = .(time, value))
  55. proc.time() - st
  56. # user  system elapsed
  57. # 0.14    0.03    0.17
  58.  
  59. #                        time value cnt
  60. #      1: 2014-04-11 12:00:00    31   1
  61. #      2: 2014-04-11 13:00:00     4   3
  62. #      3: 2014-04-11 14:00:00    17   2
  63. #      4: 2014-04-11 15:00:00     2   1
  64. #      5: 2014-04-11 16:00:00    40   1
  65. #     ---
  66. # 128084: 2017-09-11 03:00:00    29   1
  67. # 128085: 2017-09-11 16:00:00     6   1
  68. # 128086: 2017-09-11 22:00:00    24   1
  69. # 128087: 2017-09-12 05:00:00     4   1
  70. # 128088: 2017-09-12 10:00:00    31   1
Advertisement
Add Comment
Please, Sign In to add comment