Извлечение строк из имени файла и создание новых столбцов с помощью mutate - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть data.frame с двумя столбцами.Во втором столбце указаны имена файлов.

df  <- data.frame(paragraph = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.",
             filename = "./data/RevCon_2015_C1_Austria_05_06.txt", stringsAsFactors = FALSE)

Как извлечь из этого второго столбца определенные строки (используя stringr) и добавить их (используя dplyr::mutate) в качестве дополнительных переменных (конференция, год, страна)и т. д.), чтобы я получил следующий результат:

df2  <- data.frame(paragraph = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.",
              filename = "./data/RevCon_2015_C1_Austria_05_06.txt", conference = "RevCon", year = "2015", country= "Austria", date = "06.05.2015", stringsAsFactors = FALSE)

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Вот два различных подхода, использующих separate и extract из tidyr:

library(dplyr)
library(tidyr)

df %>%
  mutate(filename2 = gsub("^(\\w+)_(\\d+)_.+?_(\\w+)_(\\d{2})_(\\d{2}).+$", 
                          "\\1_\\2_\\3_\\5.\\4.\\2", basename(filename))) %>%
  separate(filename2, c("conference", "year", "country", "date"), sep = "_")

или extract:

df %>%
  extract(filename, c("conference", "year", "country", "day", "month"),
          "^.+/(\\w+)_(\\d+)_.+?_(\\w+)_(\\d{2})_(\\d{2}).+$",
          remove = FALSE) %>%
  unite(date, month, day, year, sep = ".", remove = FALSE) %>%
  select(paragraph, filename, conference, year, country, date)

Результат:

                                                                   paragraph
1 Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
                                 filename conference year country       date
1 ./data/RevCon_2015_C1_Austria_05_06.txt     RevCon 2015 Austria 06.05.2015

Примечания:

  1. При первом подходе gsub используется для сопоставления каждого «столбца», который мы хотим использовать с помощью групп захвата, и повторно-заказ по желанию.Обратите внимание, что добавлено _, чтобы различать столбцы
    • Я использовал функцию basename, чтобы извлечь все после того, как последний /
    • separate затем используется для разделения элементовв фактические столбцы с разделителем _
  2. Во втором подходе используется то же регулярное выражение, но вместо перестановки extract обрабатывает каждую группу захвата как отдельный столбец
    • unite связывает month, day и year вместе без удаления исходных столбцов
    • Наконец select удаляет day и month и изменяет порядок столбцов
0 голосов
/ 24 апреля 2018

Мы можем сделать следующее, используя tidyr::separate:

library(tidyverse);
df %>%
    mutate(tmp = gsub("(\\./data/|\\.txt)", "", filename)) %>%
    separate(
        tmp,
        into = c("conference", "year", "ignored", "country", "month", "day")) %>%
    mutate(date = paste(day, month, year, sep = "/")) %>%
    select(-ignored, -month, -day)
#          paragraph                                filename conference year
#1 Lorem ipsum [...] ./data/RevCon_2015_C1_Austria_05_06.txt     RevCon 2015
#  country        date
#1 Austria  06/05/2015

Обратите внимание, это предполагает, что filename s придерживается следующего шаблона: ./data/{conference}_{year}_{ignored}_{country}_{month}_{day}.txt


Пример данных

df  <- data.frame(
    paragraph = "Lorem ipsum [...]",
    filename = "./data/RevCon_2015_C1_Austria_05_06.txt",
    stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...