将一个字符串列表转换为数字列表,应该如何操作?

3

我被给予一个由数字组成的列表字符串:

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]"

请指导我如何将其转换回常规的数字列表?
我尝试使用strsplit,as.data.frame,但这似乎很冗长。
我希望有一些高效且创造性的方法。

1
你可以尝试使用 stringi 库中的 as.integer(stri_extract_all(s, regex = "\\d+")[[1]]) - akrun
1
在安装完stringi库后,你是否已经加载了它?在 R 中,你可以使用正则表达式 \\d+(一个或多个数字)提取数字后将其存储为 vector - akrun
1
我在下面的解决方案中添加了一些描述。 - akrun
1
亲爱的@akrun,非常感谢您的出色回答!我从您的回答中学到了很多! - steves
1
谢谢。很高兴知道我的回答对您有帮助。 - akrun
显示剩余2条评论
3个回答

3

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非常感谢您提供如此详细的答案! - steves

1

一种选择是使用 stri_extractstringi 包)从字符串中提取数字。 stri_extract_all 的输出是一个长度为 1 的 vector 列表。通常,如果 's' 有多个元素(这里是单个字符串),我们使用 unlist 将其转换为单个 vector,然后用 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" 

提取包含向量的列表元素。
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" 

然后将包含字符元素的向量转换为整数。

1
太棒了!非常感谢! - steves

1
这里是R语言基础解决方案。
此行仅提取数字并将其保存到列表中。
numbers <- regmatches(s, gregexpr("[[:digit:]]+", s))

将列表取消列表化并转换为数字。
numbers <- as.numeric(unlist(numbers))

Result

 [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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接