我有一个英文和荷兰语的数据框架:
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行)?
答案 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,可以创建要加入的密钥表。