data.table不会按预期修改列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了data.table不会按预期修改列相关的知识,希望对你有一定的参考价值。

我有一个功能

delete.all.after.pattern <- function (x,pattern) strsplit(x,pattern)[[1]][1]

和data.table

a <- c(1:3)
b <- c("a","b
 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, "
"), `[[`, 1L)]

您也可以将代码放入函数中并调用它

fun <- function(x, p) lapply(strsplit(x, p), `[[`, 1L)
dt [, b := fun(b, "
")]

另一种方法是使用data.table::tstrsplit如下:

dt[, b := tstrsplit(b, "\n", keep=1L)]

以上是关于data.table不会按预期修改列的主要内容,如果未能解决你的问题,请参考以下文章

data.table 包中的 := (按引用传递)运算符同时修改另一个数据表对象

如何在 data.table 中添加一列并返回多列而不修改基础数据?

在给定行条件下,Google脚本不会按预期触发

在函数中通过引用向 data.table 添加新列并不总是有效

将 data.table 列与数值列中的 NA 进行比较

data.table 分组所有列的总和