Вы можете использовать strsplit
и tstrsplit
из data.table
следующим образом (назовите ваш стол DT
):
library(data.table)
setDT(DT)
DT = DT[ , c(.SD, tstrsplit(comments, ';', fixed = TRUE))]
DT = DT[ , strsplit(V9, '|', fixed = TRUE), by = row]
DT[ , c('key', 'val1', 'val2') := tstrsplit(V1, '[:,]', type.convert = TRUE)]
DT[ , val1 := 1-val1][]
# row V1 key val1 val2
# 1: 8 One:0.9995,0.13 One 0.0005 0.13
# 2: 8 Two:0.9991,0.55 Two 0.0009 0.55
# 3: 8 Three:0.9996,0.33 Three 0.0004 0.33
# 4: 8 Four:0.9986,0.22 Four 0.0014 0.22
# 5: 8 Five:0.9987,0.22 Five 0.0013 0.22
tstrsplit
делает strsplit
, а затем transpose
- - это берет входную строку x
и превращает ее в один столбец для каждого результата split
каждого элемента x
.
На втором шаге я предположил, что row
является уникальным идентификатор каждой строки. Это может быть медленным, если есть много row
с - вы можете попробовать здесь для некоторых других подходов к "unnesting" V9
в разные строки.
Тогда мы tstrsplit
снова, чтобы получить желаемое значение в качестве собственного столбца; обратите внимание, что type.convert
автоматически преобразует столбцы, которые выглядят как числа, в числа (вместо цифр в виде строк).
Мы можем изменить это, если вы хотите вернуть данные в исходный формат строки, но это Будет проще работать с вашими данными в текущем формате.