2015-10-18 15 views
5

In data.table v.1.9.6 è possibile dividere una variabile in colonne in questo modo:assegnare dinamicamente numero di divisioni in tstrsplit data.table

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

Il numero di suddivisioni richieste [sopra: 2] non è sempre noto in anticipo. Come posso generare i nomi delle variabili richieste quando il numero di suddivisioni è noto?

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 

risposta

4

Due metodi. Il primo è fortemente suggerito:

#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 

più

Se non si conosce la quantità di spaccature in anticipo:

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

Se si specificano più divisioni, è possibile che si ricicli. Potrebbero avere un errore di battitura nella loro domanda: "Come posso generare i nomi delle variabili richieste quando il numero delle divisioni è noto?" '. Forse intendevano scrivere "sconosciuto". –

+0

significavano conosciuti. ho modificato la domanda per renderla [si spera] cancellata impostando n = 2. – Henk

+0

Quindi la risposta sopra lo farà. –

0

Un altro modo semplice di fare questo. Invece di creare colonne aggiuntive, puoi impilare le stringhe divise in una singola colonna:

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