Преобразование текстовых данных с интервалом в датафрейм - PullRequest
0 голосов
/ 11 ноября 2018

Есть такие текстовые данные

※ 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

или есть HTML-файл, подобный этому

<div style='AAAA'>
※ 19:20 AAAA (BB:CC)<br /><br /><br /><br />--DDDD<br />aaaa       33.1   bbbb         23.8   cccc   20.9<br /><br /><br />--EEEE<br />aaaaa         11.8

То, что я хочу сделать в Dataframe, это

Time     Type1      Type2     Data1         Data2
19:20    AAAAA      DDDD      aaaa          33.1
19:20    AAAAA      DDDD      bbbb          23.8
19:20    AAAAA      EEEE      aaaaa         11.8

Как мне это сделать?

1 Ответ

0 голосов
/ 11 ноября 2018

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...