我想找到第一次值<的行。 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。在我的框架中发生了几次。我想找到每个名字第一次发生的行
更新:对无序日期必须强大。当然你可以事先订购但是 - 你知道;-)是懒惰的
答案 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