如何在R中最后一次发生某个观察后找到日期?

时间:2016-02-26 15:09:06

标签: r

我在R中使用dplyr对数据进行了分组。我想找到' date'在每组中最后一次观察(' B')等于或大于1(1,2,3或4)之后(' A')。换句话说,' date'其中1/2/3/4已变为0。

简单地找到第一次出现0的日期将不起作用,因为在某些组1/2/3/4切换到0然后再返回并且不会给出结果我喜欢。

我希望这个' date'为每个组提供一个新列(' 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?

2 个答案:

答案 0 :(得分:5)

这是一个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]

答案 1 :(得分:0)

我选择了dplyr,因为我认为代码比data.table

更容易阅读
library(dplyr)
df %>%
  group_by(A) %>%
  mutate(
    Date0 = date[B == 0][1]
  )