【发布时间】:2015-05-16 21:54:17
【问题描述】:
我在选择 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 与 v1 最小的一行匹配的 np4*np5 行中进行选择. 然后,所需的输出应该是一个从原始表中选择 np1 行的表,即包含原始表中的所有变量。我知道如何从 data.table 中选择行,如何使用表达式和“by”,但我还没有设法将所有这些放在一起以产生所需的结果。
更新:我找到了答案。诀窍是,如何在“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 是一个 data.table,其中包含每个组的 x 数据的子集,不包括 by(或 keyby)中使用的任何列。
【问题讨论】:
标签: r data.table