gpt4 book ai didi

r - 使用 data.table 按组选择第 n 个观察值和求和

转载 作者:行者123 更新时间:2023-12-03 16:53:47 25 4
gpt4 key购买 nike

我想通过为 a 选择一组的最后一个观察值,将第一个表变成第二个表。和 b ,第一次观察 c ,对 d 的组的每个观察值求和和 e ,并为 f , 检查是否存在有效日期并使用该日期。

表格1:

ID   a    b    c        d        e          f
1 10 100 1000 10000 100000 ?
1 10 100 1001 10010 100100 5/07/1977
1 11 111 1002 10020 100200 5/07/1977
2 22 222 2000 20000 200000 6/02/1980
3 33 333 3000 30000 300000 20/12/1978
3 33 333 3001 30010 300100 ?
4 40 400 4000 40000 400000 ?
4 40 400 4001 40010 400100 ?
4 40 400 4002 40020 400200 7/06/1944
4 44 444 4003 40030 400300 ?
4 44 444 4004 40040 400400 ?
4 44 444 4005 40050 400500 ?
5 55 555 5000 50000 500000 31/05/1976
5 55 555 5001 50010 500100 31/05/1976

表 2:
ID   a    b    c         d        e          f
1 11 111 1000 30030 300300 5/07/1977
2 22 222 2000 20000 200000 6/02/1980
3 33 333 3000 60010 600100 20/12/1978
4 44 444 4000 240150 2401500 7/06/1944
5 55 555 5000 100010 1000100 31/05/1976

我查过 StackOverflow 的问题,我只看到了其中的元素。我可以通过以下步骤完成到 e。
library(data.table)

setwd('D:/Work/BRB/StackOverflow')

DT = data.table(fread('datatable.csv', header=TRUE))

AB = DT[ , .SD[.N], ID ]
AB = AB[ , c('a', 'b') ]

C = DT[ , .SD[1], ID ]
C = C[ , 'c' ]
DE = DT[ , .(d = sum(d), e = sum(e)) , by = ID ]

Final = cbind(AB, C, DE)
Final

我的问题是,我可以对变量 a进行操作吗? , b , c , d , e在一次转换中而不必将其拆分为 3?

另外,我不知道该怎么做 f .有什么建议?

最后,我是 R 的新手。我还可以改进我的代码吗?

最佳答案

您可以改进以下几点:

  • fread将返回一个data.table,因此无需将其包装在data.table 中.您可以通过 class(DT) 查询.
  • 使用 na.strings读入数据时的参数。请参阅下面的示例。
  • 总结如下:
    DT[, .(a = a[.N], 
    b = b[.N],
    c = c[1],
    d = sum(d),
    e = sum(e),
    f = unique(na.omit(f)))
    , by = ID]

  • 然后你会得到:

       ID  a   b    c      d       e          f
    1: 1 11 111 1000 30030 300300 5/07/1977
    2: 2 22 222 2000 20000 200000 6/02/1980
    3: 3 33 333 3000 60010 600100 20/12/1978
    4: 4 44 444 4000 240150 2401500 7/06/1944
    5: 5 55 555 5000 100010 1000100 31/05/1976


    一些解释和其他注意事项:
  • 使用 [1] 进行子集化会给你一个组的第一个值。您也可以使用 first -在中优化的功能数据表 ,从而更快。
  • 使用 [.N] 进行子集化会给你一个组的最后一个值。您也可以使用 last -在中优化的功能数据表 ,从而更快。
  • 不要使用在 R 中也是函数的变量名(在这种情况下,不要使用 c 作为变量名)。另见 ?c解释什么是 c - 功能。
  • 用于总结 f -变量,我用了 unique结合 na.omit .如果 ID 有多个唯一日期,您也可以使用例如 na.omit(f)[1] .


  • 如果速度是一个问题,您可以将上述优化为(感谢@Frank):
    DT[order(f)
    , .(a = last(a),
    b = last(b),
    c = first(c),
    d = sum(d),
    e = sum(e),
    f = first(f))
    , by = ID]

    订购方式 f会放 NA -值最后。因此,现在内部 GForce 优化用于所有计算。

    使用数据:
    DT <- fread("ID   a    b    c        d        e          f
    1 10 100 1000 10000 100000 ?
    1 10 100 1001 10010 100100 5/07/1977
    1 11 111 1002 10020 100200 5/07/1977
    2 22 222 2000 20000 200000 6/02/1980
    3 33 333 3000 30000 300000 20/12/1978
    3 33 333 3001 30010 300100 ?
    4 40 400 4000 40000 400000 ?
    4 40 400 4001 40010 400100 ?
    4 40 400 4002 40020 400200 7/06/1944
    4 44 444 4003 40030 400300 ?
    4 44 444 4004 40040 400400 ?
    4 44 444 4005 40050 400500 ?
    5 55 555 5000 50000 500000 31/05/1976
    5 55 555 5001 50010 500100 31/05/1976", na.strings='?')

    关于r - 使用 data.table 按组选择第 n 个观察值和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293909/

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