R - 从字符串中提取值

时间:2015-10-17 21:17:03

标签: 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)

我有兴趣只提取括号内的字母和数字来获取这样的数据框:

1)

L1   N1 L2   N2
 C 3327  T 1681

2)

L1   N1 L2   N2 L3  N3
CC 1158 CT 1011 TT 335

在R中是否有任何功能/包或有效方法?

2 个答案:

答案 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"