如何选择按其他变量排序的最小 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 值的主要内容,如果未能解决你的问题,请参考以下文章