Split text string in a data.table columns
Update: From version 1.9.6 (on CRAN as of Sep'15), we can use the function tstrsplit()
to get the results directly (and in a much more efficient manner):
require(data.table) ## v1.9.6+
dt[, c("PX", "PY") := tstrsplit(PREFIX, "_", fixed=TRUE)]
# PREFIX VALUE PX PY
# 1: A_B 1 A B
# 2: A_C 2 A C
# 3: A_D 3 A D
# 4: B_A 4 B A
# 5: B_C 5 B C
# 6: B_D 6 B D
tstrsplit()
basically is a wrapper for transpose(strsplit())
, where transpose()
function, also recently implemented, transposes a list. Please see ?tstrsplit()
and ?transpose()
for examples.
See history for old answers.
Using splitstackshape
package:
library(splitstackshape)
cSplit(df, splitCols = "PREFIX", sep = "_", direction = "wide", drop = FALSE)
# PREFIX VALUE PREFIX_1 PREFIX_2
# 1: A_B 1 A B
# 2: A_C 2 A C
# 3: A_D 3 A D
# 4: B_A 4 B A
# 5: B_C 5 B C
# 6: B_D 6 B D
We could try:
library(data.table)
cbind(dt, fread(text = dt$PREFIX, sep = "_", header = FALSE))
# PREFIX VALUE V1 V2
# 1: A_B 1 A B
# 2: A_C 2 A C
# 3: A_D 3 A D
# 4: B_A 4 B A
# 5: B_C 5 B C
# 6: B_D 6 B D
I add answer for someone who do not use data.table
v1.9.5 and also want an one line solution.
dt[, c('PX','PY') := do.call(Map, c(f = c, strsplit(PREFIX, '-'))) ]