2016-02-26 83 views
1

我在R中使用dplyr对数据进行了分组。我希望在每个组中最后一次观察('B')等于或大于1(1,2,3或4)之后找到'date' '一个')。换句话说,1/2/3/4已经变为0的'日期'。如何查找R中最后一次观察到的日期?

简单地找到第一次出现0的日期将不会像在某些组中那样工作1/2/3/4开关为0,然后再回来,并没有给出我想要的结果。

我希望这个'日期'为每个组在新列('date.after')中给出。

例如,给定的下述数据样本,通过分组A(这已被简化,我的数据实际上是由3个变量分组):

A B date 
a 2 1 
a 2 2 
a 1 5 
a 0 8 
b 3 1 
b 3 4 
b 3 6 
b 0 7 
b 0 9 
c 1 2 
c 1 3 
c 1 4 

我想实现如下:

A B date date.after 
a 2 1 8 
a 2 2 8 
a 1 5 8 
a 0 8 8 
b 3 1 7 
b 3 4 7 
b 3 6 7 
b 0 7 7 
b 0 9 7 
c 1 2 NA 
c 1 3 NA 
c 1 4 NA 

我希望这是有道理的,非常感谢你的帮助! 这篇帖子可能看起来很熟悉,我刚才问了一个非常类似的问题:

How to find the last occurrence of a certain observation in grouped data in R?

回答

4

更易于阅读这里的一个dplyr选项:

df %>% group_by(A) %>% mutate(date_after = date[last(which(B >= 1)) + 1]) 
#Source: local data frame [12 x 4] 
#Groups: A [3] 
# 
#  A  B date date_after 
# (fctr) (int) (int)  (int) 
#1  a  2  1   8 
#2  a  2  2   8 
#3  a  1  5   8 
#4  a  0  8   8 
#5  b  3  1   7 
#6  b  3  4   7 
#7  b  3  6   7 
#8  b  0  7   7 
#9  b  0  9   7 
#10  c  1  2   NA 
#11  c  1  3   NA 
#12  c  1  4   NA 

或者,你可以使用dplyr的nth功能:

df %>% group_by(A) %>% mutate(date_after = nth(date, last(which(B >= 1)) + 1)) 

它能做什么(在两种情况下):它计算的B等于或大于1的最后一个条目的位置,然后加1至该索引,并返回该位置的date。如果该位置不可用,则返回NA(如上一组中的情况)。

您可以使用data.table做完全一样的:

library(data.table) 
setDT(df)[, date_after := date[last(which(B >= 1)) + 1], by = A] 
+0

尼斯,这里是一个等价基本R解决方案do.call(rbind,lapply(split(data,data $ A),function(x){x $ date.after = x $ date [tail(which(x $ B> = 1),1) + 1]; x}))' –

+1

@VeerendraGadekar,谢谢,这是一个很好的建议,除非你需要用'tail(...,1)'替换'last',因为'last'是'dplyr'中的函数,而'data.table'。 –

0

我dplyr去,因为我认为代码比data.table

library(dplyr) 
df %>% 
    group_by(A) %>% 
    mutate(
    Date0 = date[B == 0][1] 
) 
+0

从Q A名言:“只要找到为0的第一次出现的日期将无法正常工作” –