2016-05-11 13 views
0

私は文字列の列、数字の後に " - "を付けた後に月の年のデータフレームを持っています。私は月と年を得るために文字列を解析しようとしています。 「 - 」の文字が非常に最初のステップとして、私はこれの位置を示して新しい列を作成するには()を変異:: dplyrを使用して文字列内の文字の位置を見つけるためにdplyr mutateを使用しています

regexpr() 
regexpr("-",yearid)[1] 

。しかし、regexpr()は、mutate()内で別々に使用される場合とは大きく異なる動作をするようです。文字列によっては更新されないようですが、前の行から文字列位置を引き継ぎます。以下の例では、 " - "文字の位置がそれぞれの年齢の4,4,5であると期待しています。しかし、私は4,4,4を得ます - したがって、この4は正しくありません。私が別々にregexprを実行すると、この問題は表示されません。

私は何かが不足していると思いますが、yearidの各値に固有の位置を動的に " - "得る方法はありますか? 1月を取得する簡単な方法があること、そして1997年5月、私は出力を得るようregExprの使用一方

yearid <- c("50 - January 1995","51 - January 1996","100 - January 1997") 
data.df <- data.frame(yearid) 
data.df <- mutate(data.df, trimpos = regexpr("-",str_trim(yearid))[1], 
       pos = regexpr("-",yearid)[1]) 

> data.df 
       yearid test1 test2 
1 50 - January 1995  4  4 
2 51 - January 1996  4  4 
3 100 - January 1997  4  4 

期待通り:

> regexpr("-",yearid[1])[1] 
[1] 4 
> regexpr("-",yearid[2])[1] 
[1] 4 
> regexpr("-",yearid[3])[1] 
[1] 5 

は最後に、私は私のSessionInfo(持っています)stringrライブラリからregexpr関数はmatch.length取り付けられた2つの追加属性と位置のベクトルを返す

R version 3.1.1 (2014-07-10) 
Platform: x86_64-apple-darwin10.8.0 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] stringr_1.0.0 dplyr_0.4.1  readr_0.2.2.9000 

loaded via a namespace (and not attached): 
[1] assertthat_0.1  DBI_0.3.1   knitr_1.10.5    lazyeval_0.1.10.9000 magrittr_1.5   parallel_3.1.1  
[7] Rcpp_0.11.6   stringi_0.4-1  tools_3.1.1   
+1

ちょうどあなたの 'mutate'式から' [1] 'sのドロップします。 – nrussell

+4

グループ化がなく、 'regexpr()'がベクトル化されていない場合、dplyrを使用するのは無意味です。 –

+0

@nrussellありがとうございました - もしそれが助けになるならば、私が気づいた問題を引き起こしたのはregexprのアイデア[1]でしたか?ちょうど根本的な問題も確実にしたかったのです。 – rajvijay

答えて

0

下回っd useBytes。コメントで述べたように、このベクトルはデータフレームに直接割り当てることができます。これは、mutate機能を使用するか使用しないで行うことができます。ここで

library(dplyr) 
library(stringr) 

id_month_year <- c(
    "50 - January 1995", 
    "51 - January 1996", 
    "100 - January 1997" 
) 
data <- data.frame(id_month_year, another_column = 1) 

## create new column using mutate 
data <- data %>% mutate(pos1 = regexpr("-", data$id_month_year)) 

## create new column without mutate 
data$pos2 <- regexpr("-", data$id_month_year) 

print(data) 

は新しい列です:

 id_month_year another_column pos1 pos2 
1 50 - January 1995    1 4 4 
2 51 - January 1996    1 4 4 
3 100 - January 1997    1 5 5 

私はtidyrライブラリからseparate機能を使用してお勧めします。ここでは例のコードスニペットです:

library(dplyr) 
library(tidyr) 

id_month_year <- c(
    "50 - January 1995", 
    "51 - January 1996", 
    "100 - January 1997" 
) 
data <- tbl_df(data.frame(id_month_year, another_column = 1)) 

clean <- data %>% 
    separate(
     id_month_year, 
     into = c("id", "month", "year"), 
     sep = "[- ]+", 
     convert = TRUE 
    ) 

print(clean) 

そしてここでは、得られたクリーンなデータフレームです:

Source: local data frame [3 x 4] 

    id month year another_column 
    (int) (chr) (int)   (dbl) 
1 50 January 1995    1 
2 51 January 1996    1 
3 100 January 1997    1 
関連する問題