避免在 R data.table 中使用 sapply
Avoiding this use of sapply in 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 的第一个元素,clean 列是重复 10 次的结果。
为了让干净的列按照我想要的方式出现,我正在使用 sapply:
dt[, ":=" (clean_2 = sapply(messy, until_parentheses))]
这给出了我想要的结果,但是当 dt 很长时 运行 需要很长时间。
我觉得我的 until_parenthese()
函数和 data.table 方法都有问题。有没有人有解决方案可以使我在这种情况下使用 sapply 变得多余?
谢谢!
您可以使用矢量化的 gsub
:
dt[,clean_3:=gsub(' +[(].*','',messy)] ## replace anything after the first ( with a blank
我编写了一个函数来删除字符串中从第一个括号开始的所有内容:
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 变得多余?
谢谢!
您可以使用矢量化的 gsub
:
dt[,clean_3:=gsub(' +[(].*','',messy)] ## replace anything after the first ( with a blank