我有一个功能
delete.all.after.pattern <- function (x,pattern) strsplit(x,pattern)[[1]][1]
和data.table
a <- c(1:3)
b <- c("a","b\n undesired text","c")
dt <- data.table(a=a, b=b)
因此,我希望dt [, b:=delete.all.after.pattern(b,"\\n")]
会导致
a b
1: 1 a
2: 2 b
3: 3 c
代替 :
a b
1: 1 a
2: 2 a
3: 3 a
我错过了什么?
我想你正在寻找:
dt [, b := sapply(b, delete.all.after.pattern, pattern="\\n")]
您的函数没有矢量化,因此它只返回第一个元素,该元素对所有行重复。
或者你可以直接在strsplit
打电话给j
:
dt [, b := lapply(strsplit(b, "\n"), `[[`, 1L)]
您也可以将代码放入函数中并调用它
fun <- function(x, p) lapply(strsplit(x, p), `[[`, 1L)
dt [, b := fun(b, "\n")]
另一种方法是使用data.table::tstrsplit
如下:
dt[, b := tstrsplit(b, "\\n", keep=1L)]