2016-02-03 4 views
1

я написал функцию, чтобы удалить все из первых скобок года в строке:избежать такого использования sapply в R data.table

until_parentheses <- function(string) { 

    one <- stringr::str_split_fixed(string, "\\(", 2)[1, 1] 

    res <- stringr::str_trim(one) 

    return(res) 

} 

И у меня есть data.table с колонкой, которая выглядит (что-то), как это:

messy <- paste(letters[1:10], paste0(c(" (", letters[1:2], ")"), collapse = "")) 

dt <- data.table(messy) 

Когда я пытаюсь использовать until_parentheses() на грязной колонке, как так

dt[, ":=" (clean = until_parentheses(messy))] 

Функция применяется только к первому элементу messy, а чистый столбец - результат, повторяемый 10 раз.

Для того, чтобы иметь чистый столбец выйти, как я хочу, чтобы я использую sapply:

dt[, ":=" (clean_2 = sapply(messy, until_parentheses))] 

Это дает результат я хочу, однако это занимает много времени, чтобы работать, когда дт долго.

Я чувствую, что есть проблемы с моей функцией until_parenthese() и с моим методом data.table. У кого-нибудь есть решение, которое делает излишним мое использование sapply в этом случае?

Спасибо!

+0

Ваша функция написана так, что вы возвращаете только первый результат (строки). '[1, 1]' должно быть '[, 1]', а затем 'sapply()' не нужно –

ответ

4

Вы можете использовать gsub который векторизованную:

dt[,clean_3:=gsub(' +[(].*','',messy)] ## replace anything after the first (with a blank 
+0

Спасибо. Мне нужно улучшить знание регулярных выражений. – efbbrown

Смежные вопросы