从 R 中的字符串中删除“c(”和“)”——优雅的解决方案?

Rob*_*ler 3 regex sqlite r

为了将 ax,y 矩阵从 R 保存到 sqlite,我必须将其转换为列表:

# convert matrix to list
sql_peaks <- list(peaks)
Run Code Online (Sandbox Code Playgroud)

结果字符串看起来像

"c(123, 234, 235, 3, 5, 6)"
Run Code Online (Sandbox Code Playgroud)

构造函数元素 c() 在进一步的数据处理步骤中令人不安(并且是不必要的),因此我将它们删除:

# remove formatting characters
sql_peaks <- gsub("c(", "", sql_peaks, fixed="TRUE")
sql_peaks <- gsub(")", "", sql_peaks, fixed="TRUE")
Run Code Online (Sandbox Code Playgroud)

导致:

123, 234, 235, 3, 5, 6
Run Code Online (Sandbox Code Playgroud)

这工作正常,但没有更优雅的解决方案吗?

r2e*_*ans 5

使用基础 R 想到两个选项:

x <- "c(123, 234, c(235), 3, 5, 6)"
Run Code Online (Sandbox Code Playgroud)

(我c(234)在中间添加了,以表明正则表达式仅影响字符串中的第一个/最后一个字符。)

gsub("^c\\(|\\)$", "", x)
# [1] "123, 234, c(235), 3, 5, 6"
substr(x, 3, nchar(x) - 1)
# [1] "123, 234, c(235), 3, 5, 6"
Run Code Online (Sandbox Code Playgroud)

在两者之间,只要你确定它总是有前导c(和尾随),我会选择后者。它也快一点:

library(microbenchmark)
microbenchmark(a=gsub("^c\\(|\\)$", "", x), b=substr(x, 3, nchar(x) - 1))
# Unit: microseconds
#  expr   min    lq     mean median     uq    max neval
#     a 7.294 7.659 10.20421  8.024 9.4825 46.314   100
#     b 1.459 1.824  2.41480  1.824 2.1890 17.140   100
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找美观的东西,那么这可能是您的解决方案。

但是,如果您正在寻找一种强大的方法来存储来自单个数据库单元的变量和可提取数据向量,我是否建议使用类似 JSON 的方法?

y <- c(123, 234, 235, 3, 5, 6)
jsonlite::toJSON(y)
# [123,234,235,3,5,6] 
jsonlite::fromJSON("[123,234,235,3,5,6]")
# [1] 123 234 235   3   5   6
Run Code Online (Sandbox Code Playgroud)

它的强大之处在于它可以相当雄辩地处理不同的类型、长度等。(此外,许多 DBMS 接受jsonjsonb数据类型。)坦率地说,还有其他序列化方法,JSON 恰好是我想到的第一个方法。