динамически назначать количество разбиений в data.table tstrsplit

В data.table v.1.9.6 вы можете разбить переменную на столбцы следующим образом:

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
7 голосов | спросил Henk 18 +03002015-10-18T19:15:28+03:00312015bEurope/MoscowSun, 18 Oct 2015 19:15:28 +0300 2015, 19:15:28

2 ответа


0

Два метода. Первый настоятельно рекомендуется:

#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)][]
ответил Pierre Lafortune 18 +03002015-10-18T19:24:16+03:00312015bEurope/MoscowSun, 18 Oct 2015 19:24:16 +0300 2015, 19:24:16
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
ответил user3576212 22 MarpmTue, 22 Mar 2016 22:56:46 +03002016-03-22T22:56:46+03:0010 2016, 22:56:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132