This has come up quite frequently on SO. Here is one example.
Conceptually, tstrsplit() is just transpose(strsplit(...), fill=.) where transpose() is implemented in #1025.
require(data.table)
dt <- data.table(category.tag=c("toys/David", "toys/David", "toys/James", "toys", "toys", "toys/James"), transaction=1:6)
# category.tag transaction
#1: toys/David 1
#2: toys/David 2
#3: toys/James 3
#4: toys 4
#5: toys 5
#6: toys/James 6
dt[, c("category", "tag") := tstrsplit(category.tag, "/", fixed=TRUE)]
# category.tag transaction category tag
#1: toys/David 1 toys David
#2: toys/David 2 toys David
#3: toys/James 3 toys James
#4: toys 4 toys NA
#5: toys 5 toys NA
#6: toys/James 6 toys James
Additionally we can also pass a fill = argument to tstrsplit.