data.table不会按预期修改列

问题描述 投票:0回答:1

我有一个功能

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

我错过了什么?

r string data.table
1个回答
1
投票

我想你正在寻找:

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)]
© www.soinside.com 2019 - 2024. All rights reserved.