2017-02-06 9 views
2
names(score) 
[1] "(Intercept)"    "aado2_calc(20,180]"  "aado2_calc(360,460]"  
[4] "aado2_calc(460,629]"  "albumin[1,1.8]"   "albumin(1.8,2.2]"   
[7] "albumin(2.2,2.8]"   "aniongap(15,18]"   "aniongap(18,20]"   
[10] "aniongap(20,22]"   "aniongap(22,25]"   "aniongap(25,49]"  

括弧内の2つの数字を抽出したい(括弧の外側にある数字は必要ありません)、 "("または "["が最初の数字はオブジェクトに割り当てられ、2番目の数字は「ハイ」。Rの文字列から数値を抽出するにはどうすればよいですか?

+0

これは何語ですか? – tilz0R

+0

申し訳ありませんが、これはR –

+0

です[括弧で囲まれた[strsplit]の複製が可能です(http://stackoverflow.com/questions/31292853/strsplit-by-parentheses) – BigDataScientist

答えて

0
のようなパッケージすることができます
scorenames <- c(
    "(Intercept)"    ,"aado2_calc(20,180]"  ,"aado2_calc(360,460]"  
,"aado2_calc(460,629]"  ,"albumin[1,1.8]"   ,"albumin(1.8,2.2]"   
,"albumin(2.2,2.8]"   ,"aniongap(15,18]"   ,"aniongap(18,20]"   
,"aniongap(20,22]"   ,"aniongap(22,25]"   ,"aniongap(25,49]" 
) 

最初の手順は、デリミター((),[]、およびカンマ,を含める)を使用します。ここから

mat <- regmatches(scorenames, 
        gregexpr("(?<=[\\[\\(,])[0-9.]+(?=[\\]\\),])", scorenames, perl = TRUE)) 
str(mat) 
# List of 12 
# $ : chr(0) 
# $ : chr [1:2] "20" "180" 
# $ : chr [1:2] "360" "460" 
# $ : chr [1:2] "460" "629" 
# $ : chr [1:2] "1" "1.8" 
# $ : chr [1:2] "1.8" "2.2" 
# $ : chr [1:2] "2.2" "2.8" 
# $ : chr [1:2] "15" "18" 
# $ : chr [1:2] "18" "20" 
# $ : chr [1:2] "20" "22" 
# $ : chr [1:2] "22" "25" 
# $ : chr [1:2] "25" "49" 

、我々は、(1)最初のものは問題がある見ることができます(驚きを、あなたがここに欲しいものを把握する必要があります)、および(2)残りは右の程度に見えます。

ここでは、このリストを処理する方法の1つです。これは非常に信頼され、NA ïは、あなたがにこれを回すことができる

newnames <- lapply(mat, function(m) { 
    if (! length(m)) return(list(low = NA, high = NA)) 
    setNames(as.list(as.numeric(m)), nm = c("low", "high")) 
}) 
str(newnames) 
# List of 12 
# $ :List of 2 
# ..$ low : logi NA 
# ..$ high: logi NA 
# $ :List of 2 
# ..$ low : num 20 
# ..$ high: num 180 
# $ :List of 2 
# ..$ low : num 360 
# ..$ high: num 460 
# ...snip... 

など、すべてが(おそらくtryCatchに)正しく変換することを、あなたはおそらく、リストの長さは2であることを確認するためのチェックを追加する必要があります... VEのdata.frameを持つ:

ただ、ジェイク・kaupp @のような
head(do.call(rbind.data.frame, newnames)) 
#  low high 
# 1 NA NA 
# 2 20.0 180.0 
# 3 360.0 460.0 
# 4 460.0 629.0 
# 5 1.0 1.8 
# 6 1.8 2.2 
1

あなたはより多くの電力のためにあなたがRでベースの正規表現関数のようなものを使用したいと思います。使いやすさのためにreadrパッケージや機能parse_numberを使用するか、またはstringi

1

は言った - 最大30倍 - stringiを使用:)あなたが見ることができるように、stringiソリューションは、短くわかりやすくしてはるかに高速です!

短い答え:

arr <- stri_extract_all_regex(x, "(?<=[\\[\\(,])[0-9.]+(?=[\\]\\),])", simplify = NA) 
data.frame(low = as.numeric(arr[,1]), high = as.numeric(arr[,2])) 

長い答え:

require(stringi) 
require(microbenchmark) 

grepFun <- function(x){ 
    mat <- regmatches(x, 
       gregexpr("(?<=[\\[\\(,])[0-9.]+(?=[\\]\\),])", x, perl = TRUE)) 
    newnames <- lapply(mat, function(m) { 
    if (! length(m)) return(list(low = NA, high = NA)) 
     setNames(as.list(as.numeric(m)), nm = c("low", "high")) 
    }) 
    do.call(rbind.data.frame, newnames) 
} 

striFun <- function(x){ 
    arr <- stri_extract_all_regex(x, "(?<=[\\[\\(,])[0-9.]+(?=[\\]\\),])", simplify = NA) 
    data.frame(low = as.numeric(arr[,1]), high = as.numeric(arr[,2])) 
} 
 
# both functions work the same 
grepFun(scorenames) 
    low high 
1  NA NA 
2 20.0 180.0 
3 360.0 460.0 
4 460.0 629.0 
... 
12 25.0 49.0 
striFun(scorenames) 
    low high 
1  NA NA 
2 20.0 180.0 
3 360.0 460.0 
4 460.0 629.0 
... 
12 25.0 49.0 
# generating more complicated vector 
n <- 10000 
x <- stri_paste(stri_rand_strings(n, length = 1:10), sample(c("(","["),n,TRUE), 
    sample(1000,n,TRUE), ",", sample(1000,n,TRUE), sample(c(")","]"), n, TRUE)) 
head(x) # check first elements 
[1] "O[68,434]"  "Ql[783,151)" "Zk0(773,60)" "ETfV(446,518]" "Xixbr(576,855)" "G6QnHu(92,955)" 
 
#short test using new data 
grepFun(x[1:6]) 
    low high 
1 68 434 
2 783 151 
3 773 60 
4 446 518 
5 576 855 
6 92 955 
striFun(x[1:6]) 
    low high 
1 68 434 
2 783 151 
3 773 60 
4 446 518 
5 576 855 
6 92 955 

#and some benchmark to prove performance 
microbenchmark(grepFun(x), striFun(x)) 
Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval 
grepFun(x) 330.27733 366.09306 416.56330 406.08914 465.29829 568.15250 100 
striFun(x) 11.57449 11.97825 13.38157 12.46927 13.67699 25.97455 100 

関連する問題