【问题标题】:Avoiding this use of sapply in R data.table避免在 R data.table 中使用 sapply
【发布时间】:2016-02-03 04:30:59
【问题描述】:

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

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, 1] 应该是[, 1],然后sapply() 不是必须的

标签: regex r data.table vectorization sapply


【解决方案1】:

您可以使用矢量化的gsub

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

【讨论】:

  • 谢谢。我需要提高我的正则表达式知识。
猜你喜欢
  • 2021-09-09
  • 2020-12-02
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2015-07-26
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多