在R中将一串数字转换为数字列表
抱歉,如果这个问题太简单,我知道如何在Python中实现,但我目前需要在R中实现 作为SQL查询的一部分,我得到一个带有一些数字的变量(长度可以变化),作为字符串,如下所示:在R中将一串数字转换为数字列表,r,R,抱歉,如果这个问题太简单,我知道如何在Python中实现,但我目前需要在R中实现 作为SQL查询的一部分,我得到一个带有一些数字的变量(长度可以变化),作为字符串,如下所示: x <- "{0.5,0.25,0.75,0.5}" 如何确保y始终是数字列表?我们可以提取第一个列表元素并转换为数字 library(stringr) as.numeric(str_extract_all(x, "[0-9.]+")[[1]]) #[1] 0.50 0.25 0.75 0.50 或者使用re
x <- "{0.5,0.25,0.75,0.5}"
如何确保y始终是数字列表?我们可以提取第一个列表元素并转换为数字
library(stringr)
as.numeric(str_extract_all(x, "[0-9.]+")[[1]])
#[1] 0.50 0.25 0.75 0.50
或者使用
regmatches/regexpr
as.numeric(regmatches(x, gregexpr("[0-9.]+", x))[[1]])
#[1] 0.50 0.25 0.75 0.50
或在移除花括号后使用扫描
scan(text= gsub("[{}]", "", x), what = numeric(), sep="," , quiet = TRUE)
您可以在base R中这样做
as.numeric(strsplit(substr(x, 2, nchar(x) - 1), ',')[[1]])
或
您可以尝试使用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
x您也可以使用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
str\u extract\u all
在stringr
包中,而不是dplyr
。(OP可能正在寻找一种只使用base R的解决方案)@smci根据OP的帖子,在stringr
中有stru remove
,对了。奇怪的是,他们似乎认为它来自dplyr
而不是stringr
。正如我上面所说,在我的IRL示例中,我刚刚加载了tidyverse,但对于可复制的示例,我忘了我需要stringr。抱歉。str\u extract\u all
来自stringr
包,您需要包含它。抱歉,在我的IRL代码中,我刚刚加载了tidyverse,它提供了dplyr和stringr,但对于可复制的示例,我忘记了我需要stringr。当然。最好始终在干净的R会话中重新测试最小可重复性示例。相关:
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
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