【问题标题】:data.table does not modify a column as expecteddata.table 没有按预期修改列
【发布时间】:2019-04-24 15:44:12
【问题描述】:

我有一个功能

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】:

    我想你正在寻找:

    dt [, b := sapply(b, delete.all.after.pattern, pattern="\\n")] 
    

    您的函数没有向量化,因此它只返回第一个元素,该元素对所有行重复。


    或者您可以直接在j中拨打strsplit

    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)]
    

    【讨论】:

    • 您的完整回答让我了解了其他 R 结构问题,非常感谢。
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多