我需要在非常大的数据集(包含多个组)的情况下执行类似于以下的操作,并在某处使用.SD缓慢读取。有没有更快的方法来执行以下操作?使用R排除观察值后快速找到分组的最小值
更准确地说,我需要创建一个新列,其中包含每个组的最小值,排除该组中的某个观察子集(类似于Excel中的minif)。
library(data.table)
dt <- data.table(valid = c(0,1,1,0,1),
a = c(1,1,2,3,4),
groups = c("A", "A", "A", "B", "B"))
dt[, valid_min := .SD[valid == 1, min(a, na.rm = TRUE)], by = groups]
随着输出:
> test
valid a k valid_min
1: 0 1 A 1
2: 1 1 A 1
3: 1 2 A 1
4: 0 3 B 4
5: 1 4 B 4
为了使它更加复杂,团体可以没有有效的条目,或者他们可以有多个有效的,但缺少的条目。我当前的代码是与此类似:
dt <- data.table(valid = c(0,1,1,0,1,0,1,1),
a = c(1,1,2,3,4,3,NA,NA),
k = c("A", "A", "A", "B", "B", "C", "D", "D"))
dt[, valid_min := .SD[valid == 1,
ifelse(all(is.na(a)), NA_real_, min(a, na.rm = TRUE))], by = k]
输出:
> dt
valid a k valid_min
1: 0 1 A 1
2: 1 1 A 1
3: 1 2 A 1
4: 0 3 B 4
5: 1 4 B 4
6: 0 3 C NA
7: 1 NA D NA
8: 1 NA D NA
谢谢!这正是我一直在寻找的:) – adamski