将dplyr中group_by、filter、min()转换为data.table遇阻求助
将dplyr分组筛选逻辑转换为data.table
原dplyr代码的作用是按var1分组,筛选出每组中var2等于该组最小值(忽略NA)的行。对应的data.table实现可以用以下两种方式:
方法一:直接在分组内筛选
library(data.table) df.2 <- df.1[, .SD[var2 == min(var2, na.rm = TRUE)], by = var1]
by = var1:按var1对数据分组.SD:代表当前分组的子数据集min(var2, na.rm = TRUE):计算当前分组内var2的最小值(忽略NA值)- 最终筛选出子数据集中
var2等于该最小值的行
方法二:先计算分组最小值再筛选
如果需要保留分组最小值的临时列,可分两步操作:
# 新增分组最小值列 df.1[, min_var2 := min(var2, na.rm = TRUE), by = var1] # 筛选目标行 df.2 <- df.1[var2 == min_var2, .(var1, var2)] # 若不需要临时列,可后续删除 df.1[, min_var2 := NULL]
测试示例
用测试数据验证结果一致性:
# 构造测试数据 df.1 <- data.table( var1 = c("A", "A", "B", "B", "B"), var2 = c(3, 1, NA, 2, 2) ) # 执行转换后的代码 df.2 <- df.1[, .SD[var2 == min(var2, na.rm = TRUE)], by = var1]
输出结果:
var1 var2 1: A 1 2: B 2 3: B 2
和原dplyr代码的输出完全一致。
内容的提问来源于stack exchange,提问作者Grillo
相关产品推荐
相关产品推荐

