Как извлечь строку из символа в одном фрейме данных и поместить в новую таблицу

#r #excel #dplyr #stringr

#r #excel #dplyr #stringr

Вопрос:

Я работаю над новым блестящим проектом и пытаюсь повторно использовать некоторые работы моего коллеги, которые он выполнил в SQL, чтобы ускорить время, необходимое для создания данных для этого приложения.

Я точно не знаю, как описать эту проблему, поэтому я сделаю это, показав, что у меня есть, и объяснив, что я хочу получить.

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

  1. Это столбец идентификатора, который в прошлом мы использовали vlookup для разделения строковых компонентов и заполнения ячеек в Excel.
  2. Значение указанного идентификатора, будь то количество, среднее значение или проценты.

Это выглядело бы следующим образом.

                                             lookup output
    1:                                 dataAU20161    142
    2:                                 dataAU20171    246
    3:                                 dataAU20181     17
    4:                                 dataAU20191      3
    5:                                 dataAU20162    193
    6:                                 dataAU20172    203
    7:                                 dataAU20182     11
    8:                                 dataAU20192      9
  

Поэтому в идеале я хотел бы преобразовать эти данные в следующий формат, где 'data' строка указывает, что они будут помещены в один и тот же фрейм данных. Годы в строке будут реализованы в виде столбцов, а число, следующее за годами (1 или 2), будет реализовано в виде столбца в качестве факторной переменной.

 x   2016    2017    2018    2019
--------------------------------
1   142     246     17      3
2   193     203     11      9
  

Мы были бы очень признательны за любую помощь в этом!

Ответ №1:

Вариантом было бы разделить столбец ‘lookup’ на два

 library(dplyr)
library(tidyr)
df1 %>%
    extract(lookup, into = c('lookup', 'rn'), 'dataAU(\d{4})(\d{1})') %>%
    pivot_wider(names_from= lookup, values_from =output) %>%
    dplyr::select(-rn)
# A tibble: 2 x 4
#  `2016` `2017` `2018` `2019`
#   <int>  <int>  <int>  <int>
#1    142    246     17      3
#2    193    203     11      9
  

данные

 df1 <- structure(list(lookup = c("dataAU20161", "dataAU20171", "dataAU20181", 
"dataAU20191", "dataAU20162", "dataAU20172", "dataAU20182", "dataAU20192"
), output = c(142L, 246L, 17L, 3L, 193L, 203L, 11L, 9L)), class = "data.frame", 
row.names = c("1:", 
"2:", "3:", "4:", "5:", "6:", "7:", "8:"))
  

Комментарии:

1. Спасибо, это отличное решение! Также могу я спросить, что также переводит регулярное выражение, которое вы использовали? Или есть ли где-нибудь, что я могу прочитать, чтобы понять больше. Я не очень хорош в них.

2. @fullera \d Подразумевает цифру и {4} означает 4 цифры, мы записываем их в виде группы ( () ), за которой следует вторая группа с одной цифрой. Это возвращает два столбца с 4 цифрами и последней цифрой соответственно), а затем преобразовать обратно в широкий формат