如何从字符串变量中提取和翻译月份

时间:2017-07-19 13:10:05

标签: r date dataframe

我有一个英文和荷兰语的数据框架:

library(stringr)
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)

我还有一个日期变量,有点非结构化,英语和荷兰语:

time <- (c("1 januari 2001", "12 december 2001", "December 9 2001", "2001 maart 13"))
time <- data.frame(time)
time$months <- NA

我想要执行以下操作:在time.frame中我希望month变量是来自日期字符串的月份,但是对于那些荷兰语的月份,我希望英语翻译使得日期$ months是等于c(&#34; 1月&#34;,&#34; 12月&#34;,&#34; 12月&#34;,&#34; 3月&#34;)。

如何最快地执行此操作,可能会阻止for循环(因为实际的data.frame有超过100000行)?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,可以创建要加入的密钥表。