【问题标题】:How to subset a data table by one column with minimal value in another如何按一列对数据表进行子集化,而另一列中的最小值
【发布时间】:2013-11-20 12:32:03
【问题描述】:

假设我有一个依赖于两个输入和一个输出的过程。该过程已经在其他地方进行了数值模拟,再次运行这些模拟是不切实际的。

我已将数据存储在表格中。该表包含(除其他外)两个关键输入参数和结果输出参数(此处分别为 v、q 和 quant)。

> v=0.01*rep(1:100, each=100)
> q=0.01*rep(seq(1:100),100)
> quant <- rnorm(10000, mean=0.5, sd=0.1)
> fd <- data.table(q,v, quant)

我的问题:输入参数空间被其中一个输入(此处为 v)的离散值细分,我想知道如何提取我的表的子集,其中第二个输入 (q) 的值产生在另一个输入保持不变的子集中,输出的某个极值(比如最接近特定值 alpha,以便我们寻找 min(abs(quant-alpha)))。例如,假设 alpha=0.5

fd1 <- subset(fd,???min(abs(quant-0.5)),by=v)

因此,结果表将具有唯一的 v 值和 quant 值,它们满足指定 alpha 和 v 的 min(abs(quant-alpha))。该表还必须包含 q 的相关值和包含在行。

我相信这个问题应该有一个非常简单的解决方案,而且我太新手了,不知道如何找到它!

【问题讨论】:

  • 我敢肯定有一些不雅的杂物涉及在一个 do 循环上循环 v 的唯一值的 rbinding,但如果我继续使用这样的解决方案,我将永远不会有效地使用 R!

标签: r data.table


【解决方案1】:

你只是想这样做吗....

fd[  , .SD[ which.min( abs(quant-0.5) ) ] , by = v ]
#        v    q     quant
#  1: 0.01 0.42 0.5010319
#  2: 0.02 0.71 0.4983129
#  3: 0.03 0.47 0.4996793
#  4: 0.04 0.01 0.5028813
#  5: 0.05 0.93 0.5009666
#  6: 0.06 0.93 0.4996367

您将获得满足使用which.min 到子集.SD 的条件的每个组(by = v)的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2019-04-24
    • 2016-03-20
    相关资源
    最近更新 更多