首页 > 解决方案 > 使用 R 中 data.table 中的 max() 有条件地更改列的内容

问题描述

我有一个包含以下信息的 data.table:

   data.table(id = c(rep(1,5)),
               year = c(rep(2015,3), rep(2016,2)), 
               class = c(rep("A", 3), rep("B", 2)),
               origin = c("Europe", "Asia", "Africa", "Europe", "Asia"), 
               count = c(30299, 3, 34, 2, 800))

   id year class origin count
1:  1 2015     A Europe 30299
2:  1 2015     A   Asia     3
3:  1 2015     A Africa    34
4:  1 2016     B Europe     2
5:  1 2016     B   Asia   800

然而,对于每一个id, yearclass只有一个位置是允许的。在这里,第一个组合具有三个位置:

1:  1 2015     A Europe 30299
2:  1 2015     A   Asia     3
3:  1 2015     A Africa    34

第二个组合有两个位置:

4:  1 2016     B Europe     2
5:  1 2016     B   Asia   800

我想更改位置,这样对于每个id, year,class组合将使用最高的位置count。这应该会产生一个像这样的表:

   id year class origin count
1:  1 2015     A Europe 30299
2:  1 2015     A Europe     3
3:  1 2015     A Europe    34
4:  1 2016     B   Asia     2
5:  1 2016     B   Asia   800

如何做到这一点?我正在考虑将数据表拆分为列表列表,然后应用 lapply,但我确信有更好/更简单的解决方案?任何提示?

标签: rlistdata.table

解决方案


DT[, origin := origin[which.max(count)], by = .(id, year, class)]

推荐阅读