如何选择按其他变量排序的最小 TRUE 值

Posted

技术标签:

【中文标题】如何选择按其他变量排序的最小 TRUE 值【英文标题】:How to select minimum TRUE values sorted by other variables 【发布时间】:2017-12-09 17:14:56 【问题描述】:

我有一组非常大的数据,按设施编号、年份和月份排序。在最后一列中,我有一组 TRUE/FALSE 语句。我设置了最后一列,以便对于每个唯一的一组(设施编号、年份和月份),该列将以 FALSE 开始,但过渡到 TRUE 时的某个点(这在我的程序的其他地方确定)。

我希望在最后一列从 FALSE 切换为 TRUE 的每个唯一集合(设施编号、年份和月份)中找到最小行号。

这是一个表格示例:

     fac_num year month     t
  1:       1 2017     1 FALSE
  2:       1 2017     1 FALSE
  3:       1 2017     1 FALSE
  4:       1 2017     1 FALSE
  5:       1 2017     1 FALSE
 ---                         
2466726:      62 2017     4  TRUE
2466727:      62 2017     4  TRUE
2466728:      65 2017     1  TRUE
2466729:      65 2017     5  TRUE
2466730:      65 2017     5  TRUE

到目前为止,我只能管理如何获取 TRUE 值的最低行数,但不能管理每个唯一的集合(设施编号、年份和月份)。

min(which(dat0a$t))

以上代码返回

64

哪个是(fac_num = 1,year = 2017,month = 1)中最低 TRUE 值的正确行号,但我想知道如何对任何(设施号、年份和月份)重复此操作无需手动输入每个组合,因为有数百种可能的组合。

【问题讨论】:

这将更容易解决一个更具重现性的例子。您应该查看dplyr 包。我想你正在寻找这样的东西:library(dplyr) dat0a %>% group_by(fac_num, year, month) %>% mutate( rn = row_number(), rn_min = min(rn)) 看起来您正在使用 data.table。如果这是真的,您可以使用dat0a[, which.max(t), by=fac_num]。在基础 R 中,您可以使用 aggregate(t ~ fac_num, data=dat0a, which.max)。这是因为which.max 将返回第一个观察到的最大值的位置。 【参考方案1】:

这是使用dplyr的解决方案:

library(dplyr)

dat0a %>%
  group_by(fac_num, year, month) %>%
  summarize(row_n = min(row_number()[t == TRUE]))

首先使用group_by 设置您的组,然后在每个组中取最小的row_number() 其中t == TRUE

【讨论】:

以上是关于如何选择按其他变量排序的最小 TRUE 值的主要内容,如果未能解决你的问题,请参考以下文章

选择排序

五分钟理解选择排序算法

排序--02---选择排序

选择排序算法讲解

选择排序算法讲解

第七章 内排序——选择排序