使用sum,length和grep聚合data.table

让我们做一个data.table:

dt <- data.table(x.1=1:8,x.2=1:8,x.3=2:9,vessel=rep(letters[1:2],each=4),Year=rep(2012:2015,2))
dt
   x.1 x.2 x.3 vessel Year
1:   1   1   2      a 2012
2:   2   2   3      a 2013
3:   3   3   4      a 2014
4:   4   4   5      a 2015
5:   5   5   6      b 2012
6:   6   6   7      b 2013
7:   7   7   8      b 2014
8:   8   8   9      b 2015

我可以使用函数长度和总和来汇总它,以获得每年所有x的总和以及每年独特船只的总和,如下所示:

dt[,list(
  x.1=sum(x.1),x.2=sum(x.2),x.3=sum(x.3),vessels=length(unique(vessel))),by=list(Year=Year)]

   Year x.1 x.2 x.3 vessels
1: 2012   6   6   8       2
2: 2013   8   8  10       2
3: 2014  10  10  12       2
4: 2015  12  12  14       2

这就是我想要的,但在我的真实数据中我有很多列,所以我想使用grep或%like%,但我不能让它工作.我正在考虑与此相符:

dt[,grep("x",colnames(dt)),with = FALSE])

但是如何将其与聚合合并?

解决方法

您可以使用lapply在所有(.SD)或多个列(使用.SDcols选择)上应用函数:

dt[,lapply(.SD,sum),by=Year,.SDcols=c("x.1","x.2")]

以下内容也可用于选择名称中包含“x”的所有列:

dt[,c(lapply(.SD,vessel=uniqueN(vessel)),.SDcols=grepl("^x",names(dt))
]

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...