2015-10-18 1 views
5

の分割数を割り当てる:動的あなたがそうのような列に変数を分割することができdata.table tstrsplitに<code>data.table v.1.9.6</code>で

library(data.table) 
DT = data.table(x=c("A/B", "A", "B"), y=1:3) 
DT[, c("c1", "c2") := tstrsplit(x, "/", fixed=TRUE)][] 

必要分割数を[上:2]は常に事前に知られていません。 分割数が分かっている場合、どのように必要な変数名を生成できますか?

n = 2 # desired number of splits 
# naive attempt to build required string 
m = paste0("'", "myvar", 1:n, "'", collapse = ",") 
m = paste0("c(", m, ")") 

# [1] "c('myvar1','myvar2','myvar3')" 


DT[, m := tstrsplit(x, "/", fixed=TRUE)][] # doesn't work 

答えて

4

2つの方法。最初が強く示唆された:

#one 
n=2 
DT[, paste0("myvar", 1:n) := tstrsplit(x, "/", fixed=T)][] 
#  x y myvar1 myvar2 
#1: A/B 1  A  B 
#2: A 2  A  NA 
#3: B 3  B  NA 

#two 
DT[, eval(parse(text=m)) := tstrsplit(x, "/", fixed=TRUE)][] 
#  x y myvar1 myvar2 
#1: A/B 1  A  B 
#2: A 2  A  NA 
#3: B 3  B  NA 

余分

を使用すると、事前に分割の量がわからない場合:

splits <- max(lengths(strsplit(DT$x, "/"))) 
DT[, paste0("myvar", 1:splits) := tstrsplit(x, "/", fixed=T)][] 
+1

を、それがリサイクルされます可能性があります。彼らは質問にタイプミスがあるかもしれません: ''スプリットの数が分かっているときに、どのように必要な変数名を生成できますか? 'たぶん彼らは「未知」と書くことを意図していました。 –

+0

は既知の意味です。 n = 2に設定することで[うまくいけば]クリアされる質問を編集しました。 – Henk

+0

それでは、上記の答えがあります。 –

0

これを行うためのもう一つの簡単な方法を。代わりに、余分な列を作り、あなたは、単一の列に分割さ文字列をスタックすることができます:あなたはより多くの分割を指定した場合

DT = data.table(x=c("A/B", "A", "B"), y=1:3) 

DT1 <- DT[, .(new=tstrsplit(x, "/",fixed=T)), by=y] 
DT1 

# y new 
# 1: 1 A 
# 2: 1 B 
# 3: 2 A 
# 4: 3 B 
関連する問題