从R中的不一致字符串中提取数字

Extracting number from a non-consistent string in R

我的数据如下

空闲|空闲|空闲|空闲|空闲|空闲|空闲

空闲|56|55|49|50|53|48|54|52|空闲|空闲|空闲|空闲|空闲|空闲 空闲|49|51|48|50|50|49|50|57|56|57|56|空闲|空闲|69|86|65|空闲|空闲|空闲|空闲

我想提取中间的数字(这是 phone ASCII 格式的数字)是

(56|55|49|50|53|48|54|52 第二行和 49|51|48|50|50|49|50|57|56|57|第 3 行 56),

将它们转换为“0 和 9”之间的数字,并在新列中连接为 string/number,在同一数据集中连接为 phone_number。

新列的第 2 行应为 871230652,第 3 行应为 13022129898

在ASCII格式中48代表0,57代表9

请帮忙

谢谢,

这是一种使用正则表达式的方法:

res <- sapply(regmatches(x, gregexpr("^(?:Idle\|)*\K\d+(?=\|)|\G(?!^)\|\K\d+", 
                                     x, perl = TRUE)), 
              function(x) paste(as.integer(x) - 48, collapse = ""))
# [1] ""            "87125064"    "13022129898"

如果要排除空字符串,可以使用以下命令:

res[as.logical(nchar(res))]
# [1] "87125064"    "13022129898"

这里 x 是这个向量:

x <- c("Idle|Idle|Idle|Idle|Idle|Idle|Idle",
       "Idle|56|55|49|50|53|48|54|52|Idle|Idle|Idle|Idle|Idle|Idle",
       "Idle|49|51|48|50|50|49|50|57|56|57|56|Idle|Idle|69|86|65|Idle|Idle|Idle|Idle")