celestialgod

unnest in data.table

Oct 19th, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 1.12 KB | None | 0 0
  1.  
  2. library(data.table)
  3. library(pipeR)
  4. DT <- data.table(a = list(list(1:5), list(2:4), list(1:5)), b = 1:3,
  5.                  c = list(list(0:4), list(6:8), list(7:11)),  d = 2:4)
  6. #         a b      c d
  7. # 1: <list> 1 <list> 2
  8. # 2: <list> 2 <list> 3
  9. # 3: <list> 3 <list> 4
  10. autoFind <- function(DT){
  11.   setdiff(names(DT), names(DT)[sapply(DT, function(x) any(class(x) %in% "list"))])
  12. }
  13. extendTbl <- function(DT, groupbyVar = autoFind(DT)){
  14.   expr <- setdiff(names(DT), groupbyVar) %>>%
  15.     (paste0(., "=unlist(",  ., ")")) %>>%
  16.     paste0(collapse = ",") %>>% (paste0(".(", ., ")"))
  17.   return(DT[ , eval(parse(text = expr)), by = groupbyVar])
  18. }
  19. extendTbl(DT)
  20. #     b d a  c
  21. #  1: 1 2 1  0
  22. #  2: 1 2 2  1
  23. #  3: 1 2 3  2
  24. #  4: 1 2 4  3
  25. #  5: 1 2 5  4
  26. #  6: 2 3 2  6
  27. #  7: 2 3 3  7
  28. #  8: 2 3 4  8
  29. #  9: 3 4 1  7
  30. # 10: 3 4 2  8
  31. # 11: 3 4 3  9
  32. # 12: 3 4 4 10
  33. # 13: 3 4 5 11
  34. extendTbl(DT, c("b", "d"))
  35. #     b d a  c
  36. #  1: 1 2 1  0
  37. #  2: 1 2 2  1
  38. #  3: 1 2 3  2
  39. #  4: 1 2 4  3
  40. #  5: 1 2 5  4
  41. #  6: 2 3 2  6
  42. #  7: 2 3 3  7
  43. #  8: 2 3 4  8
  44. #  9: 3 4 1  7
  45. # 10: 3 4 2  8
  46. # 11: 3 4 3  9
  47. # 12: 3 4 4 10
  48. # 13: 3 4 5 11
Advertisement
Add Comment
Please, Sign In to add comment