R:select data.table 中的特定行

R: select specific rows in data.table

我有一个 selecting 行 data.table 的具体问题,到目前为止还没有解决。我有一个数据集,用于存储一系列参数的模拟结果。数据集中的列包含参数或结果值,请参见下面的代码("p" 用于参数列,"v" 用于值列。

# create dataset for demonstration
params <- expand.grid (seq(0,0.5,by=.1),
                       seq(1,10),
                       seq(100,105),
                       letters[1:4],
                       letters[10:14])
colnames(params) <- paste("p",1:5,sep="")
data <- data.table(cbind(params,runif(nrow(params)),rnorm(nrow(params))))
setnames(data, c(colnames(params),"v1","v2"))

我现在想提取:对于每个 p1,对于 p2 和 p3 的给定值,对于 p4、p5 的任意值,v1 的值最小的行。 设 np4 和 np5 是 p4 和 p5 的唯一值的数量,对于每个唯一的 p1 和给定的 p2、p3,我想在 p1、p2、p3 匹配那一行的 np4*np5 行中 select其中 v1 最小。 然后,所需的输出应该是 table,其中 np1 行 select 来自原始 table,即包含原始文件所做的所有变量。我知道如何从 data.table 中提取 select 行,如何使用表达式和 "by",但我还没有设法将它们组合在一起以产生所需的结果。

更新:我找到了答案。诀窍是,如何select在“by”创建的子集中的最佳行?(当然,已经有一个内置的)解决方案:

np4 <- c("a", "b")
np5 <- c("m", "n")

ss2 <- data[ p4 %in% np4 & p5 %in% np5,
            .SD[which(v1==min(v1)),],
             by = "p1"]

来自 data.table 文档:

.SD is a data.table containing the Subset of x's Data for each group, excluding any columns used in by (or keyby).

这应该有效

np4 <- c("a", "b")
np5 <- c("m", "n")
data[p4 %in% np4 & p5 %in% np5,
     list(v1 = min(v1), v2 = v2[which.min(v1)]),
     by = c("p1", "p2", "p3", "p4", "p5")]