2016-09-07 12 views
2

は次のようになります。(str_subがトリックを行うようには見えない)

7 digit identifier _ NAME4 digit value - 4 digit valueからlocation1 - - 4 digit valuelocation27-digit identifier _ junk _ _ junk3 digit value with junk attached

そう例えば:

と私は新しい列を必要
1234567_NAME:0011-1234-0176-town-car:1234567_000001_original_010qyz 

  • 7桁の識別子( "1234567")

  • NAME

  • 4桁の値の
  • の各
  • 各拠点
  • 3桁の値

str_sub()文字列の一部の長さが可変であるため、機能しません。

私はgsubを試してみましたが、一部の特殊文字が複数回(すなわち「:」と 『 - 』)を繰り返しているので、私は、文字列の明確に定義された部分を抽出するためにそれらを使用することはできません

+1

正規表現を見てください。このようなもののために設計されています。パッケージ 'stringr'は' str_extract'と呼ばれる便利なメソッドを持っていて、正規表現のマッチを文字列から取り出すことができます。 –

答えて

1

へ。あなたは「続ける場合

s <- "1234567_NAME:0011-1234-0176-town-car:1234567_000001_original_010qyz" 
ss <- c(s,s,s) 

library(stringr) 
mat <- str_split_fixed(ss, "[_:-]", 11)[,-c(9, 10)] 
mat 
#  [,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8]  [,9]  
#[1,] "1234567" "NAME" "0011" "1234" "0176" "town" "car" "1234567" "010qyz" 
#[2,] "1234567" "NAME" "0011" "1234" "0176" "town" "car" "1234567" "010qyz" 
#[3,] "1234567" "NAME" "0011" "1234" "0176" "town" "car" "1234567" "010qyz" 

mat[,9] <- sub("(\\d{3}).*", "\\1", mat[,9]) 
mat 
#  [,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8]  [,9] 
#[1,] "1234567" "NAME" "0011" "1234" "0176" "town" "car" "1234567" "010" 
#[2,] "1234567" "NAME" "0011" "1234" "0176" "town" "car" "1234567" "010" 
#[3,] "1234567" "NAME" "0011" "1234" "0176" "town" "car" "1234567" "010" 
1

:長い正規表現を避けるため、1つのオプションは削除し、区切り文字として[_:-]str_split_fixedを使用して、マトリックスの中にあなたが必要のない列を列を分割し、最後の列から数値を抽出することです長い正規表現の場合、このようなことをすることができます。あなたはフィールド長を埋め込んでいます):

library(stringi) 
library(purrr) 

pat <- "(.{7})_([[:alnum:][:space:]]+):([[:digit:]]{4})-([[:digit:]]{4})-([[:digit:]]{4})-([[:alnum:][:space:]]+)-([[:alnum:][:space:]]+):([[:digit:]]{7})_[[:alnum:][:space:]]+_[[:alnum:][:space:]]+_([[:digit:]]{3})" 

dat <- "1234567_NAME:0011-1234-0176-town-car:1234567_000001_original_010qyz" 
dat <- rep(dat, 10) 

cols <- c("id", "name", "val1", "val2", "val3", "loc1", "loc2", "val3") 

stri_match_all_regex(dat, pat) %>% 
    map_df(~setNames(as.list(.[,c(2:8,10)]), cols)) 
## # A tibble: 10 x 7 
##   id name val1 val2 val3 loc1 loc2 
##  <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
## 1 1234567 NAME 0011 1234 010 town car 
## 2 1234567 NAME 0011 1234 010 town car 
## 3 1234567 NAME 0011 1234 010 town car 
## 4 1234567 NAME 0011 1234 010 town car 
## 5 1234567 NAME 0011 1234 010 town car 
## 6 1234567 NAME 0011 1234 010 town car 
## 7 1234567 NAME 0011 1234 010 town car 
## 8 1234567 NAME 0011 1234 010 town car 
## 9 1234567 NAME 0011 1234 010 town car 
## 10 1234567 NAME 0011 1234 010 town car 
+0

うわー、Psidomとhrbrmstrの詳細とクイックフィードバックの両方に感謝します!私は両方の提案を試みたが、どちらも完璧に動作していた(しかもかなり速く、データセットに> 2.000.000行含まれていた)。私は初心者の状態のためにupvoteを傾けるが、私は真剣にあなたの時間を感謝します! – Hendrik

関連する問題