【问题标题】:How to pull string from character in one dataframe and place into a new table如何从一个数据框中的字符中提取字符串并放入新表中
【发布时间】:2020-08-18 00:02:27
【问题描述】:

我正在开发一个新的闪亮项目,并尝试重复使用我同事在 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

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: r excel dplyr stringr


    【解决方案1】:

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

    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:"))
    

    【讨论】:

    • 谢谢,这是一个很好的解决方案!我也可以问一下你使用的正则表达式翻译了什么吗?或者有什么地方我可以阅读以了解更多信息。我不太擅长这些。
    • @fullera \\d 表示数字,{4} 表示 4 位数字,我们将它们捕获为一组 (()),然后是第二组一个数字。这将分别返回两列(分别为 4 位和最后一位),然后重新整形为宽格式
    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多