gpt4 book ai didi

r - 按组将不同的功能应用于不同的列集

转载 作者:行者123 更新时间:2023-12-04 09:38:02 24 4
gpt4 key购买 nike

我有一个具有以下功能的data.table:

  • bycols:将数据分为组的列
  • nonvaryingcols:在每个组中保持不变的列(以便从每个组中获取第一项并将其传递通过就足够了)
  • datacols:要汇总/汇总的列(例如,将它们汇总到组中)

  • 我很好奇,将上述所有三个输入作为字符向量,可以用什么最有效的方法来进行混合崩溃。它不一定是绝对最快的,但具有合理语法的足够快的速度将是理想的。
    示例数据,其中不同的列集存储在字符向量中。
    require(data.table)
    set.seed(1)
    bycols <- c("g1","g2")
    datacols <- c("dat1","dat2")
    nonvaryingcols <- c("nv1","nv2")
    test <- data.table(
    g1 = rep( letters, 10 ),
    g2 = rep( c(LETTERS,LETTERS), each = 5 ),
    dat1 = runif( 260 ),
    dat2 = runif( 260 ),
    nv1 = rep( seq(130), 2),
    nv2 = rep( seq(130), 2)
    )
    最终数据应如下所示:
       g1 g2      dat1      dat2 nv1 nv2
    1: a A 0.8403809 0.6713090 1 1
    2: b A 0.4491883 0.4607716 2 2
    3: c A 0.6083939 1.2031960 3 3
    4: d A 1.5510033 1.2945761 4 4
    5: e A 1.1302971 0.8573135 5 5
    6: f B 1.4964821 0.5133297 6 6
    我已经设计出两种不同的实现方法,但一种方法极其呆板且笨拙,而另一种则非常慢。如果那时没有人提出更好的建议,将在明天发布。

    最佳答案

    与通常以这种编程方式使用[.data.table一样,通常的策略是构造一个表达式e,可以在j参数中对其求值。一旦您了解了这一点(就像我确定的那样),它就变成了computing on the language的游戏,可以得到一个j -slot表达式,看起来就像您在命令行中写的一样。

    例如,在这里,并给出示例中的特定值,您希望进行如下调用:

    test[, list(dat1=sum(dat1), dat2=sum(dat2), nv1=nv1[1], nv2=nv2[1]),
    by=c("g1", "g2")]

    因此,您想要在 j -slot中求值的表达式是
    list(dat1=sum(dat1), dat2=sum(dat2), nv1=nv1[1], nv2=nv2[1])

    以下大多数功能仅通过构造该表达式来承担:
    f <- function(dt, bycols, datacols, nvcols) {
    e <- c(sapply(datacols, function(x) call("sum", as.symbol(x))),
    sapply(nvcols, function(x) call("[", as.symbol(x), 1)))
    e<- as.call(c(as.symbol("list"), e))
    dt[,eval(e), by=bycols]
    }

    f(test, bycols=bycols, datacols=datacols, nvcols=nonvaryingcols)
    ## g1 g2 dat1 dat2 nv1 nv2
    ## 1: a A 0.8403809 0.6713090 1 1
    ## 2: b A 0.4491883 0.4607716 2 2
    ## 3: c A 0.6083939 1.2031960 3 3
    ## 4: d A 1.5510033 1.2945761 4 4
    ## 5: e A 1.1302971 0.8573135 5 5
    ## ---
    ## 126: v Z 0.5627018 0.4282380 126 126
    ## 127: w Z 0.7588966 1.4429034 127 127
    ## 128: x Z 0.7060596 1.3736510 128 128
    ## 129: y Z 0.6015249 0.4488285 129 129
    ## 130: z Z 1.5304034 1.6012207 130 130

    关于r - 按组将不同的功能应用于不同的列集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273072/

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