2017-07-05 30 views
0

我有一个非常大的一组数据,按设施号,年份和月份排序。在最后一列中,我有一组TRUE/FALSE语句。我为此设置了最后一列,以便对于每个唯一的一组(设施编号,年份和月份),该列将从FALSE开始,但以TRUE(在我的程序中的其他位置确定)转换为某个点。如何选择按其他变量排序的最小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 

到目前为止,我已经能够只管理如何获得真正的价值最低的行数的整体,而不是每个一套独特的(设施数,年和月)。

min(which(dat0a$t)) 

上面的代码返回

64 

这是在最低真值正确的行数(fac_num = 1年= 2017年,月= 1),但我想知道如何为任何(设施号码,年份和月份)组合重复此操作,而无需手动输入每个组合,因为有数百个潜在组合。

+0

这将更容易解决一个更可重复的例子。你应该看看'dplyr'包。我认为你正在寻找的东西是这样的:'库(dplyr) dat0a%>% GROUP_BY(fac_num,年,月)%>% 变异( RN = ROW_NUMBER(), rn_min =分钟(RN)) ' – roarkz

+0

看起来你正在使用data.table。如果这是真的,你可以使用'dat0a [,which.max(t),by = fac_num]'。在基数R中,你可以做'汇总(t_fa_n_num,data = dat0a,which.max)'。这是有效的,因为'which.max'将返回第一个观察到的最大值的位置。 – lmo

回答

0

下面是使用dplyr一个解决方案:

library(dplyr) 

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

首先安装使用group_by您的组,然后取各组内的最低row_number()其中t == TRUE

+0

谢谢!这工作完美! –