【问题标题】:Turning a string of numbers into a list of numbers in R将一串数字变成R中的数字列表
【发布时间】:2018-06-25 20:59:29
【问题描述】:

抱歉,如果这个问题太简单了,我知道如何在 Python 中做到这一点,但我目前在 R 中需要它。

作为 SQL 查询的一部分,我得到一个带有一些数字(长度可以变化)的变量,作为一个字符串,如下所示:

x <- "{0.5,0.25,0.75,0.5}" 

我可以去掉括号和逗号,因此:

library(stringr)
library(dplyr)
y <- x %>%
  str_remove_all("[{]") %>%
  str_remove_all("[}]") %>%
  strsplit(",")

...但我收到的输出仍然是一个字符串列表:

> y
[[1]]
[1] "0.5"  "0.25" "0.75" "0.5"

如何确保 y 始终是数字列表?

【问题讨论】:

  • str_extract_all 来自stringr 包,您需要包含它。
  • 抱歉,在我的 IRL 代码中,我刚刚加载了 tidyverse,它为我提供了 dplyr 和 stringr,但对于可重现的示例,我忘记了我需要 stringr。
  • 当然。最好始终在干净的 R 会话中重新测试您的最小可重现示例。

标签: r


【解决方案1】:

你可以在基础 R 中这样做

as.numeric(strsplit(substr(x, 2, nchar(x) - 1), ',')[[1]])

as.numeric(strsplit(gsub('[{]|[}]', '', x), ',')[[1]])

【讨论】:

    【解决方案2】:

    我们可以提取第一个列表元素并转换为数字

    library(stringr)
    as.numeric(str_extract_all(x, "[0-9.]+")[[1]])
    #[1] 0.50 0.25 0.75 0.50
    

    或者base R 使用regmatches/regexpr

    as.numeric(regmatches(x, gregexpr("[0-9.]+", x))[[1]])
    #[1] 0.50 0.25 0.75 0.50
    

    或者去掉大括号后使用scan

    scan(text= gsub("[{}]", "", x), what = numeric(), sep="," , quiet = TRUE)
    

    【讨论】:

    • str_extract_allstringr 包中,而不是dplyr。 (OP 可能正在寻找仅使用 base R 的解决方案)
    • @smci 根据 OP 的帖子,str_removestringr
    • 对了。奇怪的是,他们似乎认为它来自dplyr 而不是stringr
    • 正如我上面所说,在我的 IRL 示例中,我刚刚加载了 tidyverse,但对于可重现的示例,我忘记了我需要 stringr。道歉。
    【解决方案3】:

    你也可以使用scan

    scan(text=substr(x,2,nchar(x)-1),sep=",")
    [1] 0.50 0.25 0.75 0.50
    

    不确定性能是否是一个问题,但我很好奇,所以这里有一个基准:

    在较长的字符串上:

    x <- paste0("{",paste(1:1e4,collapse=","),"}")
    
    as.numeric(str_extract_all(x, "[0-9.]+")[[1]])
    library(stringr)
    microbenchmark::microbenchmark(
    ak1 = as.numeric(str_extract_all(x, "[0-9.]+")[[1]]),
    ak2 = as.numeric(regmatches(x, gregexpr("[0-9.]+", x))[[1]]),
    ak3 = scan(text= gsub("[{}]", "", x), what = numeric(), sep="," , quiet = TRUE),
    mkr = as.numeric(strsplit(gsub("[{}]","",x), split = ",")[[1]]),
    sat = as.numeric(unlist( strsplit( gsub("[^0-9.,]", "", x), ",") ) ),
    ry1 = as.numeric(strsplit(substr(x, 2, nchar(x) - 1), ',')[[1]]),
    ry2 = as.numeric(strsplit(gsub('[{]|[}]', '', x), ',')[[1]]),
    mm  = scan(text=substr(x,2,nchar(x)-1),sep=",", quiet = TRUE),
    unit = "relative" 
    )
    
    # Unit: relative
    # expr       min        lq      mean    median        uq       max neval
    # ak1  1.083862  1.081196  1.024354  1.075517  1.056627 0.3696952   100
    # ak2 20.581096 19.829962 18.775549 19.599953 19.307974 5.7053902   100
    # ak3  1.309869  1.313783  1.258867  1.314094  1.322486 0.3918785   100
    # mkr  2.817353  2.765637  2.682597  2.761487  2.719283 0.9331140   100
    # sat  2.908291  2.871177  2.784193  2.871431  2.815423 1.4278423   100
    # ry1  2.521181  2.463614  2.329599  2.456323  2.423078 0.6853562   100
    # ry2  2.932874  2.859785  2.778728  2.865958  2.828777 0.8790090   100
    #  mm  1.000000  1.000000  1.000000  1.000000  1.000000 1.0000000   100
    

    在原始短字符串上:

    # Unit: relative
    # expr      min    lq     mean   median    uq      max neval
    #  ak1 2.183908 2.520 2.513167 2.445887 2.464 4.383178   100
    #  ak2 3.574713 3.625 3.573718 3.432900 3.412 6.752336   100
    #  ak3 5.114943 4.860 4.746448 4.532468 4.620 5.981308   100
    #  mkr 1.425287 1.360 1.344941 1.285714 1.336 1.355140   100
    #  sat 1.873563 1.810 1.783697 1.753247 1.736 2.121495   100
    #  ry1 1.000000 1.000 1.000000 1.000000 1.000 1.000000   100
    #  ry2 1.471264 1.415 1.359581 1.354978 1.336 1.074766   100
    #  mm  4.390805 4.400 4.314622 4.134199 4.224 6.682243   100
    

    【讨论】:

      【解决方案4】:

      您可以尝试使用gsub先替换{},然后使用strsplit进行向量拆分。最后,将其转换为数字:

      x <- "{0.5,0.25,0.75,0.5}" 
      as.numeric(strsplit(gsub("[{}]","",x), split = ",")[[1]])
      #[1] 0.50 0.25 0.75 0.50
      

      【讨论】:

        猜你喜欢
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多