gpt4 book ai didi

R - 如何基于多个因素在不同的 data.table 列上运行平均值和最大值并返回原始列名

转载 作者:行者123 更新时间:2023-12-04 02:07:18 28 4
gpt4 key购买 nike

我正在更改我的 R 代码 data.frame + plyrdata.table因为我需要一种更快、更节省内存的方法来处理大数据集。不幸的是,我的 R 技能非常有限,而且我一整天都在碰壁。如果这里的专家可以启发,将不胜感激。

我的目标

  • 基于 2 个函数在我的 data.table 中聚合行 - 平均值和最大值 - 在选定的列上运行(列名通过向量传递),同时按列分组也通过向量传递。
  • 生成的 DT 应包含原始列名。
  • 不应该为了节省内存而对 DT 进行不必要的复制

  • 我的测试代码
    DT = data.table( a=LETTERS[c(1,1,1:4)],b=4:9, c=3:8, d = rnorm(6), 
    e=LETTERS[c(rep(25,3),rep(26,3))], key="a" )

    GrpVar1 <- "a"
    GrpVar2 <- "e"
    VarToMax <- "b"
    VarToAve <- c( "c", "d")

    我尝试过但对我不起作用的方法
    DT[, list( b=max( b ), c=mean(c), d=mean(d) ), by=c( GrpVar1, GrpVar2 ) ]  
    # Hard-code col name - not what I want

    DT[, list( max( get(VarToMax) ), mean( get(VarToAve) )), by=c( GrpVar1, GrpVar2 ) ]
    # Col names become 'V1', 'V2', worse, 1 column goes missing - Not what I want either

    DT[, list( get(VarToMax)=max( get(VarToMax) ),
    get(VarToAve)=mean( get(VarToAve) ) ), by=c( GrpVar1, GrpVar2 ) ]
    # Above code gave Error!

    附加问题

    基于我对 DT 的非常有限的了解, with = F参数应该指示 R 解析 VarToMax 和 VarToAve 的值,但运行下面的代码会导致错误。
    DT[, list( max(VarToMax), mean(VarToAve) ), by=c( GrpVar1, GrpVar2 ), with=F ]

    # Error in `[.data.table`(DT, , list(max(VarToMax), mean(VarToAve)), by = c(GrpVar1, :
    # object 'ansvals' not found
    # In addition: Warning message:
    # In mean.default(VarToAve) :
    # argument is not numeric or logical: returning NA

    现有的 SO 解决方案无济于事

    阿伦的 solution是我如何做到这一点,但我很困。他的另一个 solution使用 lapply.SDcols涉及创建 2 个额外的 DT,这不符合我的内存节省要求。
    dt1 <- dt[, lapply(.SD, sum), by=ID, .SDcols=c(3,4)]
    dt2 <- dt[, lapply(.SD, head, 1), by=ID, .SDcols=c(2)]

    我对 data.table 感到很困惑!非常感激任何的帮助!

    最佳答案

    这是我卑微的尝试

    DT[, as.list(c(setNames(max(get(VarToMax)), VarToMax), 
    lapply(.SD[, ..VarToAve], mean))),
    c(GrpVar1, GrpVar2)]
    # a e b c d
    # 1: A Y 6 4 -0.8000173
    # 2: B Z 7 6 0.2508633
    # 3: C Z 8 7 1.1966517
    # 4: D Z 9 8 1.7291615

    或者,为了获得最大效率,您可以使用 colMeanseval(as.name())组合而不是 lapplyget
    DT[, as.list(c(setNames(max(eval(as.name(VarToMax))), VarToMax), 
    colMeans(.SD[, ..VarToAve]))),
    c(GrpVar1, GrpVar2)]
    # a e b c d
    # 1: A Y 6 4 -0.8000173
    # 2: B Z 7 6 0.2508633
    # 3: C Z 8 7 1.1966517
    # 4: D Z 9 8 1.7291615

    关于R - 如何基于多个因素在不同的 data.table 列上运行平均值和最大值并返回原始列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28279078/

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