R-从字符串中提取值
我正在处理一些具有如下字符串的数据: 1)R-从字符串中提取值,r,string,R,String,我正在处理一些具有如下字符串的数据: 1) C:0.664(3327)T:0.336(1681) 2) C | C:0.462(1158)C | T:0.404(1011)T | T:0.134(335) 我感兴趣的是提取括号内的字母和数字,以获得如下数据帧: (一) (二) 在R中是否有任何函数/包或有效的方法来实现这一点?示例 x = c( "C: 0.664 (3327)T: 0.336 (1681)", "C|C: 0.462 (1158)C|T: 0.404 (1011)T|
C:0.664(3327)T:0.336(1681)
2) C | C:0.462(1158)C | T:0.404(1011)T | T:0.134(335)
我感兴趣的是提取括号内的字母和数字,以获得如下数据帧:
(一)
(二)
在R中是否有任何函数/包或有效的方法来实现这一点?示例
x = c(
"C: 0.664 (3327)T: 0.336 (1681)",
"C|C: 0.462 (1158)C|T: 0.404 (1011)T|T: 0.134 (335)"
)
选择零件
s = strsplit(x, "\\)|(:.*?\\()")
# [[1]]
# [1] "C" "3327" "T" "1681"
#
# [[2]]
# [1] "C|C" "1158" "C|T" "1011" "T|T" "335"
正则表达式匹配两个对象:\\)
或:.*?\\(
)。在第二个选项中:
匹配任何字符
将匹配量化为“任意字符任意次数”*
告诉量词是“非贪婪的”,因此它停在?
),即使这也匹配\\(
从这里开始,执行剩下的格式化任务非常简单:
Map(function(r, n)
setNames( gsub("\\|", "", r), paste0(c("L","N"), rep(seq(n), each=2)) ),
s,
lengths(s)/2
)
# [[1]]
# L1 N1 L2 N2
# "C" "3327" "T" "1681"
#
# [[2]]
# L1 N1 L2 N2 L3 N3
# "CC" "1158" "CT" "1011" "TT" "335"
我们也可以使用
从库(stringi)
中提取所有的stri
,然后用gsub
删除
。我们使用lookahead((?=:)
)并匹配一个或多个非的字符。
或者匹配一个或多个非的字符。
([^]+
)之后是lookback()(?非常感谢,@Frank!它工作得非常出色。我只是想了解您正在使用的regexp,即“\)|(:*?\()”。我可以看出你在逃避括号,但无法理解全部含义。如果可能,你能澄清一下吗?再次感谢!@jroberayals Cool。我添加了一个解释。我最近才在这个网站上看到了*?
。不幸的是,我找不到清晰的文档来指向它。
s = strsplit(x, "\\)|(:.*?\\()")
# [[1]]
# [1] "C" "3327" "T" "1681"
#
# [[2]]
# [1] "C|C" "1158" "C|T" "1011" "T|T" "335"
Map(function(r, n)
setNames( gsub("\\|", "", r), paste0(c("L","N"), rep(seq(n), each=2)) ),
s,
lengths(s)/2
)
# [[1]]
# L1 N1 L2 N2
# "C" "3327" "T" "1681"
#
# [[2]]
# L1 N1 L2 N2 L3 N3
# "CC" "1158" "CT" "1011" "TT" "335"
library(stringi)
stri_extract_all_regex(gsub('\\|', '', x), '[^)]+(?=:)|(?<=\\()[^)]+')
#[[1]]
#[1] "C" "3327" "T" "1681"
#[[2]]
#[1] "CC" "1158" "CT" "1011" "TT" "335"
res <- read.table(text=gsub('\\:[^(]+|[()]', ' ',
gsub('[|]', '', x)),
sep='', header=FALSE, stringsAsFactors=FALSE, na.strings='', fill=TRUE)
# V1 V2 V3 V4 V5 V6
#1 C 3327 T 1681 <NA> NA
#2 CC 1158 CT 1011 TT 335
str(res)
#'data.frame': 2 obs. of 6 variables:
# $ V1: chr "C" "CC"
# $ V2: int 3327 1158
# $ V3: chr "T" "CT"
# $ V4: int 1681 1011
# $ V5: chr NA "TT"
# $ V6: int NA 335