1) Сначала удалите все, что есть в паранах, включая те, которые дают txt2
. Затем разделите то, что осталось в --
разделителях, и сгладьте его, получив txt3
. Затем отсканируйте слова отдельно для каждого элемента, дающего s
, и преобразуйте его в матрицу m
и фрейм данных DF
. Наконец, конвертируйте типы столбцов. Пакеты не используются.
txt2 <- gsub("[(].*?[)]", "", txt)
txt3 <- unlist(strsplit(txt2, "--"))
s <- lapply(txt3, function(x) scan(text = x, what = "", quiet = TRUE))
m <- cbind(s[[1]][1], s[[1]][2], do.call("rbind", lapply(s[-1],
function(x) cbind(x[1], matrix(x[-1],,2, byrow = TRUE)))))
DF <- as.data.frame(m, stringsAsFactors = FALSE)
DF[] <- lapply(DF, type.convert, stringsAsFactors = FALSE)
дает:
> DF
V1 V2 V3 V4 V5
1 19:20 AAAA DDDD aaaa 33.1
2 19:20 AAAA DDDD bbbb 23.8
3 19:20 AAAA DDDD cccc 20.9
4 19:20 AAAA DDDD ddddd 14.9
5 19:20 AAAA DDDD eeeee 8.3
6 19:20 AAAA DDDD ffffff 6.8
7 19:20 AAAA DDDD gggggg 4.5
8 19:20 AAAA DDDD hhhhhh 4.2
9 19:20 AAAA EEEE aaaaa 11.8
2) Если мы можем предположить, что только пятый столбец является числовым, то мы можем использовать этот более простой альтернативный подход. Сначала удалите парены и все, что находится внутри, как показано выше, а затем отсканируйте слова в s
. Найдите позиции ix
слов, содержащих только цифры и точки, а затем выделите каждое поле, объединяя их в data.frame.
txt2 <- gsub("[(].*?[)]", "", txt)
s <- scan(text = txt2, what = "", quiet = TRUE)
ix <- grep("^[0-9.]+$", s)
data.frame(
V1 = s[1],
V2 = s[2],
V3 = sub("--", "", s[sapply(ix-2, function(i) tail(grep("--", s[seq(i)]), 1))]),
V4 = s[ix-1],
V5 = as.numeric(s[ix]),
stringsAsFactors = FALSE
)
Примечание
Предполагается, что ввод:
txt <- "19:20 AAAA (BBB:CCC) --DDDD aaaa 33.1 bbbb 23.8 cccc 20.9 ddddd 14.9 eeeee 8.3 ffffff 6.8 gggggg 4.5 hhhhhh 4.2 --EEEE aaaaa 11.8"