R 如何从一个数据帧中的字符中提取字符串并将其放入新表中

R 如何从一个数据帧中的字符中提取字符串并将其放入新表中,r,excel,dplyr,stringr,R,Excel,Dplyr,Stringr,我正在从事一个新的闪亮项目,并试图重新利用我同事在SQL中所做的一些工作,以加快为该应用程序构建数据所需的时间 我不知道该如何描述这个问题,所以我会通过展示我所拥有的和解释我想要得到的来描述 本质上,我们有一个SQL脚本,它将一组数据分为两列 是一个标识符列,过去我们使用vlookup拆分字符串组件并在excel中填充单元格 是所述标识符的值,无论是计数、平均值还是百分比 它将如下所示 lookup outp

我正在从事一个新的闪亮项目,并试图重新利用我同事在SQL中所做的一些工作,以加快为该应用程序构建数据所需的时间

我不知道该如何描述这个问题,所以我会通过展示我所拥有的和解释我想要得到的来描述

本质上,我们有一个SQL脚本,它将一组数据分为两列

  • 是一个标识符列,过去我们使用vlookup拆分字符串组件并在excel中填充单元格
  • 是所述标识符的值,无论是计数、平均值还是百分比
  • 它将如下所示

                                                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
    

    在此方面的任何帮助都将不胜感激

    一个选项是将“查找”列分为两列

    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
    
    库(dplyr)
    图书馆(tidyr)
    df1%>%
    提取(lookup,into=c('lookup','rn'),'dataAU(\\d{4})(\\d{1})%>%
    pivot\u更宽(名称\u from=查找,值\u from=输出)%>%
    dplyr::选择(-rn)
    #一个tibble:2x4
    #  `2016` `2017` `2018` `2019`
    #         
    #1    142    246     17      3
    #2    193    203     11      9
    
    数据
    df1谢谢这是一个很好的解决方案!我还可以问一下你用的正则表达式也翻译了什么吗?或者有什么地方可以让我读得更明白。我不太擅长它们。@fullera
    \\d
    表示数字,而
    {4}
    表示4个数字,我们将它们作为一个组(
    ()
    )捕获,然后是第二个组和一个数字。这将返回两列(分别为4位和最后一位),然后重新调整为宽格式
    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:"))