R-从字符串中提取值

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|

我正在处理一些具有如下字符串的数据:

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