R Split String с круглыми скобками - PullRequest
0 голосов
/ 04 мая 2020
DATA = data.table("COL1"=c("(1.12,3)", "(5.4,7)", "(-9,12)", "(0.4,7)"),
                  "CAT"=c(1.12, 5.4, -9, 0.4),
                  "FOX"=c(3, 7, 12, 7))

Я хочу sh разделить COL1 на CAT и FOX, но не ставить скобки Вот что я пытаюсь:

DATA[, c("CAT1", "FOX1") := tstrsplit(COL1, ",", fixed=TRUE)]

Я ищу метод data.table

Ответы [ 3 ]

3 голосов
/ 04 мая 2020

Вот подход :

new_animals = c("CAT_new", "FOX_new")
DATA[, (new_animals) := tstrsplit(substr(COL1, 2L, nchar(COL1) - 1L), ",", fixed = TRUE)]
DATA[, (new_animals) := lapply(.SD, as.numeric), .SDcols = new_animals]
DATA

#       COL1   CAT   FOX CAT_new FOX_new
#     <char> <num> <num>   <num>   <num>
#1: (1.12,3)  1.12     3    1.12       3
#2:  (5.4,7)  5.40     7    5.40       7
#3:  (-9,12) -9.00    12   -9.00      12
#4:  (0.4,7)  0.40     7    0.40       7

По сути, это говорит о том, что нам не нужен первый и последний символ строки. Затем мы хотим преобразовать эти tstrsplit() выходные данные в тип numeric.

2 голосов
/ 04 мая 2020

Использование регулярного выражения:

library(data.table)
DATA[, c('CAT1', 'FOX1') := list(sub('\\((-?\\d+(?:\\.\\d+)?),.*', '\\1', COL1), 
                                 sub('.*,(\\d+)\\)', '\\1', COL1))]

DATA
#       COL1   CAT FOX CAT1 FOX1
#1: (1.12,3)  1.12   3 1.12    3
#2:  (5.4,7)  5.40   7  5.4    7
#3:  (-9,12) -9.00  12   -9   12
#4:  (0.4,7)  0.40   7  0.4    7

Первый захватывает числа до запятой, а второй - после запятой. Поскольку в первой части у нас могут быть числа без десятичных знаков, я использовал группу без захвата с необязательными символами.

1 голос
/ 05 мая 2020

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

cols <- c("CAT1", "FOX1")
DATA[, (cols) := tstrsplit(gsub("\\(|\\)", "", COL1), ",", type.convert = TRUE)]

#        COL1   CAT   FOX  CAT1  FOX1
# 1: (1.12,3)  1.12     3  1.12     3
# 2:  (5.4,7)  5.40     7  5.40     7
# 3:  (-9,12) -9.00    12 -9.00    12
# 4:  (0.4,7)  0.40     7  0.40     7
...