选择第n个观察值并使用data.table按组进行求和

brb*_*brb 8 r data.table

我想通过选择一组的最后观察打开第一个表到第二ab,第一个观察c,和每个观测的组de,和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
Run Code Online (Sandbox Code Playgroud)

表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
Run Code Online (Sandbox Code Playgroud)

我查了StackOverflow问题,我只看到了这个元素.我可以通过以下步骤进行操作.

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
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以做变量的操作a,b,c,d,e在一个转型而无需将其分为3个?

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

最后,我是R.的新手.我还能改进其他代码吗?

Jaa*_*aap 10

您可以改进几件事:

  1. fread将返回一个data.table,因此无需将其包装data.table.你可以查看class(DT).
  2. na.strings读入数据时使用该参数.请参阅下面的示例.
  3. 总结:

    DT[, .(a = a[.N], 
           b = b[.N], 
           c = c[1], 
           d = sum(d), 
           e = sum(e), 
           f = unique(na.omit(f)))
       , by = ID]
    
    Run Code Online (Sandbox Code Playgroud)

然后你会得到:

   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
Run Code Online (Sandbox Code Playgroud)

一些解释和其他说明:

  • 子集[1]将为您提供组的第一个值.您还可以使用firstdata.table中优化的-function,从而更快.
  • 子集[.N]将为您提供组的最后一个值.您还可以使用lastdata.table中优化的-function,从而更快.
  • 不要使用也是R中的函数的变量名(在这种情况下,不要c用作变量名).另请参阅有关-function的功能?c的说明c.
  • 为了总结f-variable,我unique结合使用na.omit.如果有多个唯一日期ID,您也可以使用例如na.omit(f)[1].

如果速度是一个问题,你可以优化上面的(thx到@Frank):

DT[order(f)
   , .(a = last(a), 
       b = last(b), 
       c = first(c), 
       d = sum(d), 
       e = sum(e), 
       f = first(f))
   , by = ID]
Run Code Online (Sandbox Code Playgroud)

按顺序排序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='?')
Run Code Online (Sandbox Code Playgroud)