stri_split_fixed 在 data.table 在 R
stri_split_fixed in a data.table in R
我有一个data.tableDT
如下
DT <- structure(list(V1 = structure(1:3, .Label = c("S01", "S02", "S03" ), class = "factor"), V2 = structure(c(1L, 3L, 2L), .Label = c("Alan Hal << Guy John", "Bruce Dick Jean-Paul << Damien", "Jay << Barry Wally Bart"), class = "factor")), .Names = c("V1", "V2"), row.names = c(NA, -3L), class = "data.frame")
# DT
# V1 V2
# 1 S01 Alan Hal << Guy John
# 2 S02 Jay << Barry Wally Bart
# 3 S03 Bruce Dick Jean-Paul << Damien
setDT(DT)
我正在尝试在“<<”处拆分 V2
列,并在两个新列中获取输出。
我可以使用 stringi
按如下方式完成
T <- as.data.frame(do.call(rbind, stri_split_fixed(DT$V2, "<<", 2)))
setnames(T, old = colnames(T), new = c("V3", "V4"))
cbind(DT, T)
V1 V2 V3 V4
1: S01 Alan Hal << Guy John Alan Hal Guy John
2: S02 Jay << Barry Wally Bart Jay Barry Wally Bart
3: S03 Bruce Dick Jean-Paul << Damien Bruce Dick Jean-Paul Damien
但是我想使用 :=
运算符通过引用来做同样的事情。如何使用 data.table?
我对 RHS 部分有困难。
DT[, c("V1", "V2) := list()]
stri_split_fixed(DT$V2, "<<", 2)
给出一个包含 3 个字符向量长度为 2 的列表。如何获得一个包含 2 个字符向量长度为 3 的列表?
你可以试试
setDT(DT)[, c('V3', 'V4'):=do.call(rbind.data.frame,
stri_split_fixed(V2, ' << ', 2))][]
# V1 V2 V3 V4
#1: S01 Alan Hal << Guy John Alan Hal Guy John
#2: S02 Jay << Barry Wally Bart Jay Barry Wally Bart
#3: S03 Bruce Dick Jean-Paul << Damien Bruce Dick Jean-Paul Damien
或者您可以使用 strsplit
(来自@David Arenburg 的评论)
setDT(DT)[, c('V3', 'V4'):= do.call(rbind.data.frame,
strsplit(as.character(V2), " << "))]
更有效的选择(如@Ananda Mahto 所建议)
cbind(DT, `colnames<-`(stri_split_fixed(DT$V2,
" << ", simplify = TRUE), c("V3", "V4")))
另一种选择是使用 splitstackshape
中的 cSplit
library(splitstackshape)
cSplit(DT, 'V2', ' << ', stripWhite=FALSE, drop=FALSE)
# V1 V2 V2_1 V2_2
#1: S01 Alan Hal << Guy John Alan Hal Guy John
#2: S02 Jay << Barry Wally Bart Jay Barry Wally Bart
#3: S03 Bruce Dick Jean-Paul << Damien Bruce Dick Jean-Paul Damien
cSplit
的更快版本可在 Gist
中提供与 stri_split
类似的性能
我有一个data.tableDT
如下
DT <- structure(list(V1 = structure(1:3, .Label = c("S01", "S02", "S03" ), class = "factor"), V2 = structure(c(1L, 3L, 2L), .Label = c("Alan Hal << Guy John", "Bruce Dick Jean-Paul << Damien", "Jay << Barry Wally Bart"), class = "factor")), .Names = c("V1", "V2"), row.names = c(NA, -3L), class = "data.frame")
# DT
# V1 V2
# 1 S01 Alan Hal << Guy John
# 2 S02 Jay << Barry Wally Bart
# 3 S03 Bruce Dick Jean-Paul << Damien
setDT(DT)
我正在尝试在“<<”处拆分 V2
列,并在两个新列中获取输出。
我可以使用 stringi
T <- as.data.frame(do.call(rbind, stri_split_fixed(DT$V2, "<<", 2)))
setnames(T, old = colnames(T), new = c("V3", "V4"))
cbind(DT, T)
V1 V2 V3 V4
1: S01 Alan Hal << Guy John Alan Hal Guy John
2: S02 Jay << Barry Wally Bart Jay Barry Wally Bart
3: S03 Bruce Dick Jean-Paul << Damien Bruce Dick Jean-Paul Damien
但是我想使用 :=
运算符通过引用来做同样的事情。如何使用 data.table?
我对 RHS 部分有困难。
DT[, c("V1", "V2) := list()]
stri_split_fixed(DT$V2, "<<", 2)
给出一个包含 3 个字符向量长度为 2 的列表。如何获得一个包含 2 个字符向量长度为 3 的列表?
你可以试试
setDT(DT)[, c('V3', 'V4'):=do.call(rbind.data.frame,
stri_split_fixed(V2, ' << ', 2))][]
# V1 V2 V3 V4
#1: S01 Alan Hal << Guy John Alan Hal Guy John
#2: S02 Jay << Barry Wally Bart Jay Barry Wally Bart
#3: S03 Bruce Dick Jean-Paul << Damien Bruce Dick Jean-Paul Damien
或者您可以使用 strsplit
(来自@David Arenburg 的评论)
setDT(DT)[, c('V3', 'V4'):= do.call(rbind.data.frame,
strsplit(as.character(V2), " << "))]
更有效的选择(如@Ananda Mahto 所建议)
cbind(DT, `colnames<-`(stri_split_fixed(DT$V2,
" << ", simplify = TRUE), c("V3", "V4")))
另一种选择是使用 splitstackshape
cSplit
library(splitstackshape)
cSplit(DT, 'V2', ' << ', stripWhite=FALSE, drop=FALSE)
# V1 V2 V2_1 V2_2
#1: S01 Alan Hal << Guy John Alan Hal Guy John
#2: S02 Jay << Barry Wally Bart Jay Barry Wally Bart
#3: S03 Bruce Dick Jean-Paul << Damien Bruce Dick Jean-Paul Damien
cSplit
的更快版本可在 Gist
stri_split
类似的性能