【发布时间】:2017-10-12 15:33:44
【问题描述】:
我需要在一个非常大的数据集(有很多组)上执行类似于下面的操作,并在某处读取使用 .SD 的速度很慢。有没有更快的方法来执行以下操作?
更准确地说,我需要创建一个新列,其中包含在排除该组中的观察子集之后每个组的最小值(类似于 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
【问题讨论】:
标签: r performance data.table