fork download
  1. # data.table 解法,但道理應該不限於 data.table
  2. # d1 處理 Result*。同 Product-Sku-Result 之下有任一 "O" 就給 "O"。預先 melt 為長表格較方便。
  3. # d2 處理 Date。預先排除所有 Result 皆為 "N" 的列,再按 Date 排序,再挑出同 Product-Sku 的第一筆。
  4. # d.out 輸出結果,即 merge d1 與 d2
  5.  
  6.  
  7. library(magrittr)
  8. library(data.table)
  9. d <-
  10. data.table(
  11. Product = c("p1" %>% rep(4), "p2" %>% rep(4)),
  12. Sku = c("s", "m" %>% rep(3), "s", "m", "s", "s"),
  13. Date = as.POSIXct(8:1, origin = "2022-10-10"),
  14. Result1 = c("N", "O", "N" %>% rep(3), "O" %>% rep(2), "N"),
  15. Result2 = c("O" %>% rep(4), "N", "O" %>% rep(2), "N"),
  16. Result3 = c("O" %>% rep(6), "N" %>% rep(2)),
  17. Result4 = c("N", "O", "N" %>% rep(2), "O" %>% rep(2), "N" %>% rep(2))
  18. )
  19. print(d)
  20.  
  21. d1 <-
  22. d %>%
  23. melt(id.vars = c("Product", "Sku", "Date")) %>%
  24. .[, .(res.merge = ifelse(any(value == "O"), "O", "N")), by = .(Product, Sku, variable)] %>%
  25. dcast(Product + Sku ~ variable, value.var = "res.merge")
  26.  
  27. d2 <-
  28. d %>%
  29. melt(id.vars = c("Product", "Sku", "Date")) %>%
  30. .[, .(Date.kept = ifelse(any(value == "O"), T, F)), by = .(Product, Sku, Date)] %>%
  31. .[(Date.kept)] %>%
  32. split(by = c("Product", "Sku")) %>%
  33. lapply(function(x)x[1]) %>%
  34. do.call("rbind", .)
  35.  
  36. d.out <- merge(d1, d2, by = c("Product", "Sku"))
  37. d.out[, Date.kept := NULL]
  38. print(d.out)
Success #stdin #stdout 0.39s 42952KB
stdin
Standard input is empty
stdout
   Product Sku                Date Result1 Result2 Result3 Result4
1:      p1   s 2022-10-10 00:00:08       N       O       O       N
2:      p1   m 2022-10-10 00:00:07       O       O       O       O
3:      p1   m 2022-10-10 00:00:06       N       O       O       N
4:      p1   m 2022-10-10 00:00:05       N       O       O       N
5:      p2   s 2022-10-10 00:00:04       N       N       O       O
6:      p2   m 2022-10-10 00:00:03       O       O       O       O
7:      p2   s 2022-10-10 00:00:02       O       O       N       N
8:      p2   s 2022-10-10 00:00:01       N       N       N       N
   Product Sku Result1 Result2 Result3 Result4                Date
1:      p1   m       O       O       O       O 2022-10-10 00:00:07
2:      p1   s       N       O       O       N 2022-10-10 00:00:08
3:      p2   m       O       O       O       O 2022-10-10 00:00:03
4:      p2   s       O       O       O       O 2022-10-10 00:00:04