gpt4 book ai didi

r - 如何在data.table上运行Apply?

转载 作者:行者123 更新时间:2023-12-03 08:40:39 25 4
gpt4 key购买 nike

我有一个data.table,其中第2到20列是带空格的字符串(例如“物种名称”)。我想同时在所有这些列上运行str_replace(),以便所有的“Species Name”都变为“Species_Name”。我可以:

data.table(apply(as.data.frame(dt[,2:dim(dt)[2], with=F]), 2, 
function(x){ str_replace(x," ","_") }))

或者,如果我将其保存为 data.table对象,那么我可以一次完成这一列:
dt[,SpeciesName := str_replace(SpeciesName, " ", "_")

我如何对所有第2列到最后一列进行上述操作?

最佳答案

已于2015-11-24完全重写,以修复先前版本中的错误。

还于2019-09-27添加了更多现代选项

您有几种选择。

  • 通过对的嵌入式调用来处理所有目标列lapply(),使用:=在适当位置分配修改后的值。这个
    依靠:=的非常方便的支持来同时分配给LHS上命名的几列。
  • 使用for循环一次遍历目标列,
    使用set()依次修改每个值。
  • 使用for循环遍历多个“原始”调用
    [.data.table(),每个修改一个列。

  • 这些方法似乎都差不多快,所以您将使用哪种方法
    大多是一个品味问题。 (1)非常紧凑
    富有表现力的。这是我最常使用的,尽管您可能会发现(2)
    更容易阅读。因为它们一次处理和修改一列,所以在罕见的情况下,(2)或(3)会具有优势,在这种情况下,您的data.table如此之大,以至于您有可能遇到极限
    由R session 的可用内存强加。
    library(data.table)

    ## Create three identical 1000000-by-20 data.tables
    DT1 <- data.table(1:1e6,
    as.data.table(replicate(1e6, paste(sample(letters, nr, TRUE),
    sample(letters, nr, TRUE)))))
    cnames <- c("ID", paste0("X", 1:19))
    setnames(DT1, cnames)
    DT2 <- copy(DT1); DT3 <- copy(DT1)

    ## Method 1
    system.time({
    DT1[, .SDcols=cnames[-1L], cnames[-1L] :=
    lapply(.SD, function(x) gsub(" ", "_", x, fixed=TRUE)), ]
    })
    ## user system elapsed
    ## 10.90 0.11 11.06

    ## Method 2
    system.time({
    for(cname in cnames[-1]) {
    set(DT2, j=cname, value=gsub(" ", "_", DT2[[cname]], fixed=TRUE))
    }
    })
    ## user system elapsed
    ## 10.65 0.05 10.70

    ## Method 3
    system.time({
    for(cname in cnames[-1]) {
    DT3[ , (cname) := gsub(" ", "_", get(cname), fixed=TRUE)]
    }
    })
    ## user system elapsed
    ## 10.33 0.03 10.37

    有关 set():=的更多详细信息,请阅读其帮助页面,方法是通过键入 ?set?":="获得。

    关于r - 如何在data.table上运行Apply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9236438/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com