r - Melt data.table according to nested list -
i had data.table this:
library(data.table) dt <- data.table(a = c(rep("a", 3), rep("b", 3)), b = c(1, 3, 5, 2, 4, 6)) i needed perform operation (forecast) on values each a, decided put them in list, this:
dt <- dt[, x := .(list(b)), = a][, .sd[1,], = a, .sdcols = "x"] now wanted "melt" (that's thing comes mind) dt original form.
i few levels of a this:
dt2 <- rbind(expand.grid(dt[1, a], dt[1, x[[1]]]), expand.grid(dt[2, a], dt[2, x[[1]]])) but of course, solution impractical more levels of a.
i've tried
dt2 <- dt[, expand.grid(a, x[[1]]), = a] which results in
dt2 ## var1 var2 ## 1: 1 ## 2: 3 ## 3: 5 ## 4: b 2 ## 5: b 4 ## 6: b 6 it's interesting notice var1 doesn't follow "a - b" pattern expected (but @ least a remains).
is there better approach achieve this?
edits
expected output result of
dt2[, .(a, var2)] - corrected "melt" "dcast".
you looking method nest(convert column atomic vector type list type) , unnest(the opposite direction) in data.table way. different reshaping data either spread column values row header(dcast) or gather row headers column values(melt):
in data.table syntax, can use list , unlist on target column summarize or broadcast along group variables:
say if starting from:
dt # b # 1: 1 # 2: 3 # 3: 5 # 4: b 2 # 5: b 4 # 6: b 6 to repeat have achieved in first step, i.e. nest column b, can do:
dt_nest <- dt[, .(b = list(b)), a] dt_nest # b # 1: 1,3,5 # 2: b 2,4,6 to go opposite direction, use unlist group variable:
dt_nest[, .(b = unlist(b)), a] # b # 1: 1 # 2: 3 # 3: 5 # 4: b 2 # 5: b 4 # 6: b 6
Comments
Post a Comment