如何按分组筛选data.table中两无关列的综合最优行
问题描述
假设有如下data.table:
library(data.table) dt <- rowwiseDT( group=, a=, b=, "a", 1, 10, "a", 10, 1, "a", 9, 9, "b", 9, 9, "b", 1, 1, "c", 10, 10 )
原始数据输出:
group a b <char> <num> <num> 1: a 1 10 2: a 10 1 3: a 9 9 4: b 9 9 5: b 1 1 6: c 10 10
需要按group分组后每组保留一行,要求“最大化两个列a和b”,预期结果如下(比如a组选择a=9、b=9的行,尽管这不是两列各自的最大值):
group a b <char> <num> <num> 3: a 9 9 4: b 9 9 6: c 10 10
解决方案
从预期结果判断,核心需求是选取每组中a和b的最小值最大的行(等价于a+b之和最大的行,本案例中两种逻辑结果一致)。以下是两种data.table实现方式:
方法1:基于最小列值最大化
dt[, .SD[which.max(pmin(a, b))], by = group]
pmin(a, b):计算每行a和b的最小值which.max():定位分组内最小值最大的行索引.SD[索引]:提取对应行作为分组结果
方法2:基于列值之和最大化
如果需求是优先让两列的和最大,可使用:
dt[, .SD[which.max(a + b)], by = group]
运行结果
两种方法执行后,输出均符合预期:
group a b 1: a 9 9 2: b 9 9 3: c 10 10
内容的提问来源于stack exchange,提问作者sjenkins
相关产品推荐
相关产品推荐

