2015-10-18 52 views
5

動態分配的分割數在data.table v.1.9.6可以像這樣在列拆分變量:在data.table tstrsplit

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

兩種方法。首先強烈建議:

#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