2017-07-19 4 views
4

私は両方の英語とオランダ語の月のdata.frameを持っていますオランダ:抽出して変換する方法ヶ月は

私がやりたい
time <- (c("1 januari 2001", "12 december 2001", "December 9 2001", "2001 maart 13")) 
time <- data.frame(time) 
time$months <- NA 

次の時間data.frameに私は日付文字列から月であることを数ヶ月変数をしたいが、オランダにあるそれらヶ月間、私は英語の翻訳をしたいです日付$ monthがc( "January"、 "December"、 "December"、 "March")に等しくなるようにします。

どのようにしてこれを最も速くすることができますか?forループを防ぐことができますか(実際のdata.frameには100000を超える行があるので)?

答えて

3

ここではベクトル化されたstringiアプローチがあります。

ステップ1:オランダの月名を抽出します。

library(stringi) 
m <- stri_extract_first(tolower(dates$time), 
      regex = paste(months$months.dutch, collapse = "|")) 

ステップ2:英語の月名と一致:

dates$months <- months$months.english[match(m, months$months.dutch)] 

これは、100kの行のデータサイズのためかなり高速である必要があります。

結果は次のとおりです。

dates 
#    time months 
#1 1 januari 2001 January 
#2 12 december 2001 December 
#3 December 9 2001 December 
#4 2001 maart 13 March 
+0

これは素晴らしいです。本当にありがとう! – hjms

3
library(stringr) 
library(dplyr) 
months.english <- month.name 
months.dutch <- c("januari", "februari", "maart", "april", "mei", "juni","juli", "augustus", "september", "oktober", "november", "december") 
months <- data.frame(months.english, months.dutch) 

mtable <- data_frame(key = c(months.dutch, months.english), 
         months = rep(months.english, 2)) 

time <- (c("1 januari 2001", "12 december 2001", "December 9 2001", "2001 maart 13")) 
time <- data_frame(time) %>% 
    mutate(translate = str_extract(time, "[A-Za-z]+")) %>% 
    left_join(mtable, by = c('translate' = 'key')) 

あなたがtidyverseを使用したい場合は、あなたが参加するためにキーテーブルを作成することができます。

関連する問題