gpt4 book ai didi

r - "Loop through"data.table 计算条件平均值

转载 作者:行者123 更新时间:2023-12-04 02:00:15 26 4
gpt4 key购买 nike

我想“遍历” data.table 的行并计算每行的平均值。应根据以下机制计算平均值:

  • 查找第 i 行的标识符 ID (ID(i))
  • 查找第 i 行中 T2 的值 (T2(i))
  • 计算 Data1 的平均值所有行中的值 j ,满足这两个条件:ID(j) = ID(i)T1(j) = T2(i)
  • 在第 i 行的 Data2 列中输入计算平均值
     DF = data.frame(ID=rep(c("a","b"),each=6), 
    T1=rep(1:2,each=3), T2=c(1,2,3), Data1=c(1:12))
    DT = data.table(DF)
    DT[ , Data2:=NA_real_]
    ID T1 T2 Data1 Data2
    [1,] a 1 1 1 NA
    [2,] a 1 2 2 NA
    [3,] a 1 3 3 NA
    [4,] a 2 1 4 NA
    [5,] a 2 2 5 NA
    [6,] a 2 3 6 NA
    [7,] b 1 1 7 NA
    [8,] b 1 2 8 NA
    [9,] b 1 3 9 NA
    [10,] b 2 1 10 NA
    [11,] b 2 2 11 NA
    [12,] b 2 3 12 NA

  • 对于这个简单的例子,结果应该是这样的:
          ID T1 T2  Data1 Data2
    [1,] a 1 1 1 2
    [2,] a 1 2 2 5
    [3,] a 1 3 3 NA
    [4,] a 2 1 4 2
    [5,] a 2 2 5 5
    [6,] a 2 3 6 NA
    [7,] b 1 1 7 8
    [8,] b 1 2 8 11
    [9,] b 1 3 9 NA
    [10,] b 2 1 10 8
    [11,] b 2 2 11 11
    [12,] b 2 3 12 NA

    我认为这样做的一种方法是遍历行,但我认为这是低效的。我看过 apply()功能,但我确定它是否能解决我的问题。我也可以使用 data.frame而不是 data.table如果这会使它更有效率或更容易。真实数据集包含大约 100 万行。

    最佳答案

    经验法则是先聚合,然后加入。

    agg = DT[,mean(Data1),by=list(ID,T1)]
    setkey(agg,ID,T1)
    DT[,Data2:={JT=J(ID,T2);agg[JT,V1][[3]]}]
    ID T1 T2 Data1 Data2
    [1,] a 1 1 1 2
    [2,] a 1 2 2 5
    [3,] a 1 3 3 NA
    [4,] a 2 1 4 2
    [5,] a 2 2 5 5
    [6,] a 2 3 6 NA
    [7,] b 1 1 7 8
    [8,] b 1 2 8 11
    [9,] b 1 3 9 NA
    [10,] b 2 1 10 8
    [11,] b 2 2 11 11
    [12,] b 2 3 12 NA

    正如你所看到的,在这种情况下它有点难看(但会很快)。计划增加 drop这将避免 [[3]]位,也许我们可以提供一种方法来告诉 [.data.table评估 i在调用范围内(即没有自连接),这将避免 JT=这里需要的位是因为 ID两者都在 aggDT .
    keyby已添加到 R-Forge 上的 v1.8.0 中,以避免需要 setkey , 也。

    关于r - "Loop through"data.table 计算条件平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843774/

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