Я вижу, что вы специально просите что-то с colsplit
, но я бы посоветовал посмотреть некоторые другие альтернативы, например мою функцию cSplit
.
Подход cSplit
будет следующим:
setnames(cSplit(dt, "Test", " "), c("Var1", "Space", "Var2"))[]
# Var1 Space Var2
# 1: A - B
# 2: C - D
[]
в конце предназначено для печати результата, но вы также можете просто сохранить результат как новый data.table
.
Как он соотносится с точки зрения эффективности?
fun1 <- function() {
reshape2:::colsplit(string = dt[[1]], pattern = " ",
names = c("Var1", "Space", "Var2"))
}
fun2 <- function() {
setnames(cSplit(dt, "Test", " "),
c("Var1", "Space", "Var2"))[]
}
dt <- rbindlist(replicate(5000, dt, FALSE))
dim(dt)
# [1] 10000 1
library(microbenchmark)
microbenchmark(fun1(), fun2(), times = 10)
# Unit: milliseconds
# expr min lq median uq max neval
# fun1() 2025.84703 2093.39687 2195.75822 2390.30666 2492.65946 10
# fun2() 34.08966 36.01145 43.28036 47.45962 57.57615 10
Почему ваш colsplit
подход не сработал так, как вы ожидали?
dt[,1]
больше похоже на df[,1, drop = FALSE]
(попробуйте - вы получите ту же ошибку, что и при попытке "data.table").
Вам понадобится одно из следующего:
> dt[[1]]
[1] "A - B" "C - D"
> dt$Test
[1] "A - B" "C - D"
Что похоже на то, что вы получаете:
> df[, 1]
[1] A - B C - D
Levels: A - B C - D
21.09.2014