# data.table 解法，但道理應該不限於 data.table
# d1 處理 Result*。同 Product-Sku-Result 之下有任一 "O" 就給 "O"。預先 melt 為長表格較方便。
# d2 處理 Date。預先排除所有 Result 皆為 "N" 的列，再按 Date 排序，再挑出同 Product-Sku 的第一筆。
# d.out 輸出結果，即 merge d1 與 d2


library(magrittr)
library(data.table)
d <-
  data.table(
    Product = c("p1" %>% rep(4), "p2" %>% rep(4)), 
    Sku = c("s", "m" %>% rep(3), "s", "m", "s", "s"), 
    Date = as.POSIXct(8:1, origin = "2022-10-10"),
    Result1 = c("N", "O", "N" %>% rep(3), "O" %>% rep(2), "N"),
    Result2 = c("O" %>% rep(4), "N", "O" %>% rep(2), "N"),
    Result3 = c("O" %>% rep(6), "N" %>% rep(2)),
    Result4 = c("N", "O", "N" %>% rep(2), "O" %>% rep(2), "N" %>% rep(2))
  )
print(d)

d1 <- 
  d %>%
  melt(id.vars = c("Product", "Sku", "Date")) %>%
  .[, .(res.merge = ifelse(any(value == "O"), "O", "N")), by = .(Product, Sku, variable)] %>%
  dcast(Product + Sku ~ variable, value.var = "res.merge")

d2 <-
  d %>%
  melt(id.vars = c("Product", "Sku", "Date")) %>%
  .[, .(Date.kept = ifelse(any(value == "O"), T, F)), by = .(Product, Sku, Date)] %>%
  .[(Date.kept)] %>%
  split(by = c("Product", "Sku")) %>%
  lapply(function(x)x[1]) %>%
  do.call("rbind", .)

d.out <- merge(d1, d2, by = c("Product", "Sku"))
d.out[, Date.kept := NULL]
print(d.out)