1

次のような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「<<」で列を分割し、2 つの新しい列で出力を取得しようとしています。

次のように使用してそれを行うことができました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)長さ 2 の文字ベクトルを持つ 3 つのリストを返します。長さ 3 の文字ベクトルを持つ 2 つのリストを取得するにはどうすればよいですか?

4

1 に答える 1

6

あなたは試すことができます

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")))

別のオプションは、から使用することcSplitですsplitstackshape

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ものと同様のパフォーマンスを提供しますstri_splitGist

于 2015-01-19T11:30:02.830 に答える