【问题标题】:How can I extract elements from a bracketed list?如何从方括号列表中提取元素?
【发布时间】:2021-10-16 20:08:29
【问题描述】:

我目前有一个包含以下元素的数据集

df <- data.frame(id = c(1,2), bracketedList = c("[235.223,636.11115,7453.773]","[2355.66377,6362.1645,7633.7473]"))

我想知道如何提取bracketedList 中元素中每个逗号前的第一个数字(235.2232355.66377)、第二列等等?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用base R

    cbind(df, read.csv(text = gsub("[][]", "", df$bracketedList), header = FALSE))
    

    -输出

     id                    bracketedList       V1        V2       V3
    1  1     [235.223,636.11115,7453.773]  235.223  636.1111 7453.773
    2  2 [2355.66377,6362.1645,7633.7473] 2355.664 6362.1645 7633.747
    

    【讨论】:

      【解决方案2】:

      这也可以帮助你:

      library(dplyr)
      library(stringr)
      
      df %>%
        mutate(ext = str_extract(bracketedList, "(?<=\\[).*?(?=,)"))
      
        id                    bracketedList        ext
      1  1     [235.223,636.11115,7453.773]    235.223
      2  2 [2355.66377,6362.1645,7633.7473] 2355.66377
      

      或者在基础 R 中:

      gsub("^\\[(?<=\\[)(.*?)(?=,).*", "\\1", df$bracketedList, perl = TRUE)
      
      [1] "235.223"    "2355.66377"
      

      如果您想提取所有数字:

      library(tidyr)
      
      df %>%
        mutate(ext = str_extract_all(bracketedList, "[^,\\[\\]]+")) %>%
        unnest_wider(ext) %>%
        rename_with(~ gsub("\\.\\.\\.(\\d)", "\\1", .), contains("."))
      
      # A tibble: 2 x 5
           id bracketedList                    `1`        `2`       `3`      
        <dbl> <chr>                            <chr>      <chr>     <chr>    
      1     1 [235.223,636.11115,7453.773]     235.223    636.11115 7453.773 
      2     2 [2355.66377,6362.1645,7633.7473] 2355.66377 6362.1645 7633.7473
      

      【讨论】:

        【解决方案3】:

        您可以使用readr::parse_number,它将返回bracketedList的第一个数字。

        readr::parse_number(df$bracketedList)
        #[1]  235.2236 2355.6638
        

        要从字符串中提取所有(或任何)数据,您可以将数据读取为 json。

        cbind(df[1], do.call(rbind, lapply(df$bracketedList, jsonlite::fromJSON)))
        
        #  id        1         2        3
        #1  1  235.223  636.1111 7453.773
        #2  2 2355.664 6362.1645 7633.747
        

        【讨论】:

        • 如果我还想获得第二、第三等元素,有没有办法指定?谢谢!
        • 在这种情况下,更好的选择是将数据读取为 json,您可以使用它来获取单独列中的所有值。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多