我有一个在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,我想在np4 * np5行中进行选择,其中p1,p2,p3与v1最小的一行匹配。 然后,所需的输出应该是从原始表中选择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)中使用的任何列。
答案 0 :(得分:1)
这应该有效
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")]