【问题标题】:How to find the date after the last occurrence of a certain observation in R?如何在R中找到最后一次出现某个观察后的日期?
【发布时间】:2016-02-26 15:09:06
【问题描述】:

我在 R 中使用 dplyr 对数据进行了分组。我想在每组中最后一次出现等于或大于 1(1、2、3 或 4)的观察值(“B”)之后找到“日期” ('一种')。换句话说,1/2/3/4 的“日期”变成了 0。

仅查找第一次出现 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?

【问题讨论】:

    标签: r


    【解决方案1】:

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

    【讨论】:

    • 很好,这是一个等效的基本 R 解决方案do.call(rbind, lapply(split(data, data$A), function(x){ x$date.after = x$date[tail(which(x$B >= 1),1) + 1]; x}))
    • @VeerendraGadekar,谢谢,这是一个很好的建议,除非您需要将 last 替换为 tail(..., 1),因为 lastdplyrdata.table 中的函数。
    【解决方案2】:

    我选择了 dplyr,因为我认为代码比 data.table 更容易阅读

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

    【讨论】:

    • Q 中的引述:“仅查找第一次出现 0 的日期是行不通的”
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2018-07-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多