2016-05-09 1 views
1

ビットを正規表現で苦労させる。私はregexに新しく、以下の基本的なサンプルデータフレームを作成しました。 tidyrの抽出機能を使用して、Hourly.Payから毎時支払いをHourlyという新しい列に抽出しようとしています。Tidyrの抽出と正規表現を使用して厄介なデータフレームを整理する賃金と給与を含む列

Name <- c("Client1","Client2","Client3","Client4","Client5","Client6","Client7","Client8","Client9","Client10","Client11","Client12","Client13") 

Hourly.Pay <- c("$14.00","$14","$20.22","$18.00/Hour","$15","19/hourly","$40,000","$345.00","$1920/month","$11.25","12.75 hr","67K/year","15.25") 

Pay<-data.frame(Name,Hourly.Pay) 

以下は、私がこれまでほとんど正規表現で使ってきたものです。私は最初の2桁の後にピリオドを持たないエントリをキャプチャできませんでした。オプションのドル記号と、その後にピリオド、ピリオド、少なくとも2つ以上の数字、またはピリオドまたは他の数字のいずれかが続く2桁の数字を取得する必要があります。

Pay2 <- extract(Pay, Hourly.Pay, "Hourly", "^(\\$?\\d{2}\\.\\d*)",remove=FALSE) 

助けていただければ幸いです。可能であれば、正規表現の文字についても説明が提供されれば素晴らしいでしょう。

ありがとうございます!

+0

作品(サンプルデータのための、少なくとも)が、データと同じくらい醜いです: 'エキス(有料、Hourly.Pay、 '毎時'、「(<[\\ \?!。 (F!)、FALSE) ' – alistaire

+0

ありがとうございました。(\\ $?\\ d {2}(?:\\。\\ d *)? (?<!という意味ですか?私はこれまでに見たことがありません: – Mike

+0

'(?<!...)'は[否定的なlookbehind]です(http://www.regular-expressions.info /?)(内部の文字は後に続くものではありません)、 '(?:...)'は[巧妙なグループではありません](http://www.regular-expressions.info/brackets.html )[こちらのマッチングの説明](https://regex101.com/r/dK3uO5/1)を参照してください。 – alistaire

答えて

1

ここは答えです。私はあなたのデータを整理するために自由を取った。それはばかげて厄介で、より良いデータ管理が必要です。

library(rex) 
library(tidyr) 
library(dplyr) 
library(stringi) 

scale = data_frame(scale = c("K", ""), 
        scale_value = c(1000, 1)) 

time_unit = data_frame(time_unit = c("", "hr", "hour", "hourly", "month", "year"), 
         time_value = c(1, 1, 1, 1, 40/7*30, 40/7*30*12)) 

interpretation = 
    rex("$" %>% maybe, 
     some_of(number, ".", ",") %>% capture, 
     "K" %>% maybe %>% capture, 
     one_of(" ", "/") %>% maybe, 
     letters %>% maybe %>% capture) 

result = 
    Pay %>% 
    extract(Hourly.Pay, 
      c("wage_raw", "scale", "time_unit_raw"), 
      interpretation) %>% 
    mutate(wage = wage_raw %>% extract_numeric, 
     time_unit = 
      (wage > 10000) %>% 
      ifelse("year", time_unit_raw) %>% 
      stri_trans_tolower) %>% 
    left_join(scale) %>% 
    left_join(time_unit) %>% 
    mutate(estimated_wage = wage * scale_value/time_value) 
関連する問題