r - 使用 sum、length 和 grep 聚合 data.table

标签 r data.table aggregate

让我们制作一个 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

我可以使用函数 length 和 sum 对它进行聚合,以获得每年所有 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, sum), vessel=uniqueN(vessel)),
    by=Year,
    .SDcols=grepl("^x", names(dt))
]

关于r - 使用 sum、length 和 grep 聚合 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43976471/

相关文章:

r - stringdist 包中的 Jaccard 相似度来匹配字符串中的单词

mysql - R 使用enable-cleartext-plugin选项连接到MySQL服务器

R:在 ifelse 函数中使用 "()"内的逻辑语句在 data.table 中分配变量

r - 聚合 R 总和

python - 为什么使用聚合来查找平均值而不是在 django 中使用 tutal_sum/n

r - R 中按字符串格式过滤

r 输出表中的回归模型到单词

r - 使用 R 中的人口比率和最小/最大标准将值分配给区域

r - 对多个 data.tables 执行多项操作

database - ES管道聚合-合并多个存储桶