2015-10-18 14 views
5

W data.table v.1.9.6 można podzielić zmienną w kolumnach tak:dynamicznie przypisać liczbę podziałów w 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)][] 

liczba wymaganych podziałów [powyżej: 2] nie zawsze jest znana z góry. Jak mogę wygenerować wymagane nazwy zmiennych, gdy znana jest liczba podziałów?

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 

Odpowiedz

4

Dwie metody. Pierwszym z nich jest wysoce zalecane:

#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 

extra

Jeśli nie znać ilość podziałów wcześniej:

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

Jeśli określisz więcej podziałów, wówczas będzie można je oddać. Mogą mieć literówkę w pytaniu: "Jak mogę wygenerować wymagane nazwy zmiennych, gdy znana jest liczba podziałów?". Może chcieli napisać "nieznany". –

+0

oznaczały znane. edytowałem pytanie, aby je [mam nadzieję] wyczyścić, ustawiając n = 2. – Henk

+0

Następnie powyższa odpowiedź to zrobi. –

0

Inny prosty sposób to robi. Zamiast tworzyć dodatkowe kolumny, możesz ułożyć podzielone łańcuchy w jednej kolumnie:

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