避免在R data.table中使用sapply

时间:2016-02-03 04:30:59

标签: regex r data.table vectorization sapply

我编写了一个函数来从字符串中的第一个括号中删除所有内容:

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的第一个元素,而clean列的结果重复10次。

为了让干净的列出来我想要它,我正在使用sapply:

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

这给出了我想要的结果,但是当dt很长时运行需要很长时间。

我觉得我的until_parenthese()函数和我的data.table方法都存在问题。在这种情况下,有没有人有一个解决方案可以让我多次使用sapply?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以使用矢量化的gsub

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