【问题标题】:Given a list as string, how to convert back to list of numbers?给定一个字符串列表,如何转换回数字列表?
【发布时间】:2018-09-11 08:53:48
【问题描述】:

我得到一个字符串,它是一个数字列表:

s <- "[14,7,5,3,4,0,1,7,2,3,1,18,13,4,23,7,8,8,11,18,15,6,2,10,2,4,8,5,11,5,1,5,2,4,3,1,6,8,5,5,3,1,1,4,5,2,9,3,4,11,11,14,3,12,2,6,0,0,15,1,18,5,3,6,6,6]"

请指导我如何将其转换回常规的list 数字? 我尝试过使用strsplitas.data.frame,但它似乎很长。 我想要一些高效且有创意的东西。

【问题讨论】:

  • 你可以试试stringias.integer(stri_extract_all(s, regex = "\\d+")[[1]])
  • 安装后是否加载了library(stringi)。在R中,您可以在使用正则表达式\\d+(一位或多位数字)提取数字后存储为vector
  • 我在下面的解决方案中添加了一些描述
  • 亲爱的@akrun 非常感谢您的精彩回答!我从你的回答中学到了很多!
  • 谢谢。很高兴知道我的回答对您有帮助。

标签: r string list type-conversion


【解决方案1】:

这是 R 基础解决方案

此行只会提取数字并将其保存到列表中。

numbers <- regmatches(s, gregexpr("[[:digit:]]+", s))

取消列出列表并将其转换为数字。

numbers <- as.numeric(unlist(numbers))

结果

 [1] 14  7  5  3  4  0  1  7  2  3  1 18 13  4 23  7  8  8 11 18 15  6  2 10  2  4  8  5 11  5  1  5  2  4
[35]  3  1  6  8  5  5  3  1  1  4  5  2  9  3  4 11 11 14  3 12  2  6  0  0 15  1 18  5  3  6  6  6

【讨论】:

    【解决方案2】:

    1) JSON 问题中显示的输入是 JSON 格式,因此请使用 jsonlite 或 rjson 包,它会为您执行所需的字符串处理。

    library(jsonlite)
    fromJSON(s)
    

    给予:

     [1] 14  7  5  3  4  0  1  7  2  3  1 18 13  4 23  7  8  8 11 18 15  6  2 10  2
    [26]  4  8  5 11  5  1  5  2  4  3  1  6  8  5  5  3  1  1  4  5  2  9  3  4 11
    [51] 11 14  3 12  2  6  0  0 15  1 18  5  3  6  6  6
    

    2) strapply 如果您确实想使用字符串处理,那么一种选择是strapply 提取所有数字序列"\\d+" 并转换为数字,给出与上述相同的输出。

    library(gsubfn)
    strapply(s, "\\d+", as.numeric, simplify = c)
    

    3) 扫描或不使用任何包或正则表达式:

    scan(text = chartr("[]", "  ", s), sep = ",", quiet = TRUE)
    

    【讨论】:

    • @g-grothendieck 非常感谢您提供这个超级详细的答案!
    【解决方案3】:

    一种选择是使用stri_extractstringi 包)从字符串中提取数字。 stri_extract_all 的输出是 listvectorlength 1。通常,如果 's' 有多个元素(这里是单个字符串),将其转换为单个 vector ,我们使用unlist,然后用as.integer包装。由于只有一个 list 元素,我们可以使用 [[ 提取该元素

    library(stringi)
    as.integer(stri_extract_all(s, regex = "\\d+")[[1]])
    

    如果我们拆分代码,如前所述,stri_extract_all 返回长度为 1 的 list

    stri_extract_all(s, regex = "\\d+")
    #[[1]]####
    #[1] "14" "7"  "5"  "3"  "4"  "0"  "1"  "7"  "2"  "3"  "1"  "18" "13" "4"  "23" "7"  "8"  "8"  "11" "18" "15" "6"  "2"  "10"
    #[25] "2"  "4"  "8"  "5"  "11" "5"  "1"  "5"  "2"  "4"  "3"  "1"  "6"  "8"  "5"  "5"  "3"  "1"  "1"  "4"  "5"  "2"  "9"  "3" 
    #[49] "4"  "11" "11" "14" "3"  "12" "2"  "6"  "0"  "0"  "15" "1"  "18" "5"  "3"  "6"  "6"  "6" 
    

    提取包含vectorlist 元素

    stri_extract_all(s, regex = "\\d+")[[1]]
    #[1] "14" "7"  "5"  "3"  "4"  "0"  "1"  "7"  "2"  "3"  "1"  "18" "13" "4"  "23" "7"  "8"  "8"  "11" "18" "15" "6"  "2"  "10"
    #[25] "2"  "4"  "8"  "5"  "11" "5"  "1"  "5"  "2"  "4"  "3"  "1"  "6"  "8"  "5"  "5"  "3"  "1"  "1"  "4"  "5"  "2"  "9"  "3" 
    #[49] "4"  "11" "11" "14" "3"  "12" "2"  "6"  "0"  "0"  "15" "1"  "18" "5"  "3"  "6"  "6"  "6" 
    

    然后将character元素的vector转换为integer

    【讨论】:

    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多