library(data.table)
setDT(test)[, tstrsplit(x, "-", type.convert = TRUE, fixed = TRUE)]
# V1 V2 V3 V4
# 1: NA NA NA NA
# 2: 1 7 9 NA
# 3: 3 NA NA NA
# 4: 2 4 6 8
注意:data.table dev version 1.9.5。 type.convert 参数和因子到字符的转换已在最新的开发版本中根据 #1094 实现(感谢 Arun!)。
或者
splitstackshape::cSplit(test, "x", "-")
# x_1 x_2 x_3 x_4
# 1: NA NA NA NA
# 2: 1 7 9 NA
# 3: 3 NA NA NA
# 4: 2 4 6 8
这两个返回的数据表都可以通过分配结果然后使用setDF() 转换回数据帧。它们还都正确地将数字字符转换为分类的“整数”列。
只是为了好玩,用scan()取回数据框的方法非常困难
x <- as.character(test$x)
v <- max(vapply(strsplit(x, "-", fixed = TRUE), length, 1L))
s <- scan(text = x, what = as.list(integer(v)), sep = "-", fill = TRUE,
na.strings = "", blank.lines.skip = FALSE)
setNames(data.frame(s), make.names(seq_along(s)))
# X1 X2 X3 X4
# 1 NA NA NA NA
# 2 1 7 9 NA
# 3 3 NA NA NA
# 4 2 4 6 8