我正在处理一些包含这些字符串的数据:
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)
我有兴趣只提取括号内的字母和数字来获取这样的数据框:
1)
L1 N1 L2 N2
C 3327 T 1681
2)
L1 N1 L2 N2 L3 N3
CC 1158 CT 1011 TT 335
在R中是否有任何功能/包或有效方法?
答案 0 :(得分:2)
我们还可以在使用stri_extract_all
删除library(stringi)
后使用|
中的gsub
。我们使用预测((?=:)
)并匹配一个或多个不是)
的字符,或者匹配一个或多个不是)
([^)]+
)的字符,然后是lookbehind ((?<=\\()
)。
library(stringi)
stri_extract_all_regex(gsub('\\|', '', x), '[^)]+(?=:)|(?<=\\()[^)]+')
#[[1]]
#[1] "C" "3327" "T" "1681"
#[[2]]
#[1] "CC" "1158" "CT" "1011" "TT" "335"
我们还可以使用两个gsub
,然后将输出转换为data.frame
。使用此方法区分class
数字和字符元素。
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
注意:我们可以使用?colnames
答案 1 :(得分:1)
实施例
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"
正则表达式匹配两件事:\\)
或:.*?\\(
。在第二个:
.
匹配任何字符*
将匹配量量化为&#34;任意次数的任何字符&#34; ?
告诉量词是&#34;非贪婪的&#34;所以它会在\\(
停止,即使它也匹配.
。从那里开始执行剩余的格式化任务非常简单:
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"