2016-07-09 1 views
0

私は(MAR06のような)特定のパターンマッチング、テキストの文字列から月を抽出する機能を持つ関数の値を返しません:物事を単純化するためにRに変異が正しく

library(dplyr) 
pattern <- "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\\d{2,2}" 

find_month <- function(x) 
{ 
extracted <- str_extract(x, pattern) 
month_string <- substr(extracted, 1, 3) 
if(!is.na(month_string) && month_string[[1]] == 'MAY') 
{ 
    value <- 1 
} 
else 
{ 
    value <- -1 
} 
return(value) 
} 

を、私が唯一です月が5月かどうかをここで確認してください。 私はそれを手動でテストしたときにそれが正常に動作します:私はデータフレームの上にそれを呼び出すとき

> find_month("HELLO THERE MAY06") 
[1] 1 
> find_month("BYE SEP12") 
[1] -1 

しかし、それは常にすべての行に対して1を返します。私は間違って何を

a = c("HELLO THERE MAY06", "BYE SEP12") 
b = c(TRUE, FALSE) 
df = data.frame(desc=a, other=b) 

df_mutated <- mutate(df, month = find_month(desc)) 
df_mutated 
      desc other month 
1 HELLO THERE MAY06 TRUE  1 
2   BYE SEP12 FALSE  1 

やっていますか?

+2

なぜを使用することができます単に 'grepl(" MAY "、" HELLO THERE MAY06 "、fixed = TRUE)'を使って、必要に応じて数値に変換してください。これはyesを1、noを0とします。 –

+2

@RichardScriven:おそらく '' MAYBE NOV07 ''などのマッチを防ぐためにgrepl( 'MAY \\ d {2}'、...) – jbaums

答えて

1

"私は間違っています"と答えるには、あなたがdebugonce(find_month)のときに何が起こるかを見ることができます。 mutate関数はベクター化されているので、extractedは一致するベクトルになり、month_stringは月名のベクトルになります。 &&は長さ1のベクトルを返しますので、NAsがあるかどうか、またmonth_stringの最初の要素が'MAY'month_string[[1]]を使用しているため)かどうかによって、コードは1または-1を返します。

あなたはifelseであなたのifを交換することにより、あなたのmutate機能をvectoriseことができます。

find_month <- function(x) { 
    extracted <- str_extract(x, pattern) 
    month_string <- substr(extracted, 1, 3) 
    ifelse(!is.na(month_string) & month_string == 'MAY', 1, -1) 
} 

リチャードのsuggestiongreplを使用するのが賢明である、と述べました。

0

あなただけの各行にあなたの非ベクトル化機能を適用するためにrowwise()を使用することができ、あなたがdesc列に明確な名前を持っていると仮定すると:

R> df_mutated2 <- df %>% group_by(desc) %>% rowwise() %>% mutate(month = find_month(desc)) 
R> df_mutated2 
Source: local data frame [2 x 3] 
Groups: <by row> 

       desc other month 
       (chr) (lgl) (dbl) 
1 HELLO THERE MAY06 TRUE  1 
2   BYE SEP12 FALSE -1 
1

我々はstr_detect

library(stringr) 
library(dplyr) 
df %>% 
    mutate(month = c(1, -1)[(str_detect(desc, "MAY")+1)]) 
#    desc other month 
#1 HELLO THERE MAY06 TRUE -1 
#2   BYE SEP12 FALSE  1 
関連する問題