查找两列最小的行

时间:2017-07-20 07:05:59

标签: r

我想找到第一次值<的行。 0
我试过分组,但当然列是独立的

数据:

Date          Value      Name
2017-01-01    0          BlueCar
2017-01-02    4          BlueCar
2017-01-03    4          BlueCar
2017-01-04    0          BlueCar
2017-01-01    4          RedCar
2017-01-02    0          RedCar
2017-01-03    1          RedCar

期望的结果:

Date          Value      Name
2017-01-01    0          BlueCar
2017-01-02    0          RedCar

请注意,BlueCar有两行,其值为:0。在我的框架中发生了几次。我想找到每个名字第一次发生的行

更新:对无序日期必须强大。当然你可以事先订购但是 - 你知道;-)是懒惰的

3 个答案:

答案 0 :(得分:1)

找到所有零值,然后使用!duplicated

获取每个名称的第一个
> d0 = data[data$Value<=0,]
> d0[!duplicated(d0$Name),]
        Date Value    Name
1 2017-01-01     0 BlueCar
6 2017-01-02     0  RedCar

仅使用基础包,而不使用dplyr,数据表或其他任何内容。

答案 1 :(得分:1)

以下解决方案使用dplyr

mtcars %>% group_by(Name) %>% filter(Value <= 0) %>% top_n(1, Date)

其中group_by显然按组拆分数据,top_n得到第一个元素。在您的情况下,您可能需要Date

答案 2 :(得分:0)

我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)),order按姓名&#39;,&#39;日期,按姓名&#39;分组并指定逻辑条件(Value <=0在&#39; i&#39;中,获取第一行(head(.SD, 1)),最后将列顺序设置为原始数据集setcolorder

library(data.table)
setcolorder(setDT(df1)[order(Name, Date)][Value <=0, head(.SD, 1), Name], names(df1))[]
#         Date Value    Name
#1: 2017-01-01     0 BlueCar
#2: 2017-01-02     0  RedCar

或仅base R解决方案

df1[with(df1, tapply(seq_along(Value) *(Value <= 0), Name,
          FUN = function(x) x[x!=0][1]) ),]
#        Date Value    Name
#1 2017-01-01     0 BlueCar
#6 2017-01-02     0  RedCar