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

时间:2015-01-11 07:16:45

标签: r

我的数据如下

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

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

我想提取两者之间的数字(这是ASCII格式的电话号码)

(56 | 55 | 49 | 50 | 53 | 48 | 54 | 52 for 2nd line and 49 | 51 | 48 | 50 | 50 | 49 | 50 | 57 | 56 | 57 | 56 for 3rd line )

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

第二行新列应为871230652,第三行应为13022129898

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

请帮忙

谢谢,

1 个答案:

答案 0 :(得分:0)

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

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