使用 dplyr 的 mutate 函数对分组数据框中的 return 相对值

Using dplyr's mutate function to return relative values within a grouped data frame

我正在尝试使用 dplyr 的 mutate 函数创建一个新变量,该变量根据 ifelse 语句的值提取现有变量的相对值。这是我正在尝试实现的示例,希望能更好地说明问题:

id  from_date fobs     to_date
 a 1999-01-05    0  1999-01-10
 a 1999-01-10    0  1999-02-14
 a 1999-02-14    1  2013-12-31
 b 1999-03-19    0  1999-03-25
 b 1999-03-25    1  2013-12-31
 c 1999-02-14    0  1999-02-15
 c 1999-02-15    1  2013-12-31

数据集按 ID 分组,我试图将 "to_date" 的每个观察值分配给 "fobs" 的值等于 0 的起始日期的下一个观察值, 和 2013-12-31 其中值等于 1.

这是我最近尝试的代码,它对我不起作用,但我希望充分表达我试图用 dplyr 包完成的事情:

qdat %>% group_by(id) %>% mutate(to_date = ifelse(fobs == 1,as.Date("2013-12-31"),as.Date(lead(qdat$date)))) 

就其价值而言,这些是 运行 该代码的结果:

  id  from_date val fobs to_date
1  a 1999-01-05   5    0      NA
2  a 1999-01-10   9    0      NA
3  a 1999-02-14   4    1   16070
4  b 1999-03-19   7    0      NA
5  b 1999-03-25  14    1   16070
6  c 1999-02-14  10    0      NA
7  c 1999-02-15  11    1   16070

我查看了 "Hands on dplyr tutorial for faster data manipulation in R"(R-Bloggers),R-Studio 在 "The Grammar and Graphics of Data Science," 上的介绍,其中包含关于 dplyr 的附加信息,以及关于 dplyr 包和相关单元格引用的其他 Whosebug 问题一般,但我还没有找到解决这个问题的方法。作为记录,我也是 R 的新手,所以如果我忽略了一些对其他人来说非常明显的事情,我提前道歉。

尝试:

library(dplyr)

qdat %>% group_by(id) %>%
         mutate(to_date = lead(from_date, default = as.Date("2013-12-31")))

您可以去掉 ifelse,因为最后一个在您的示例中始终是默认值。如果没有,请看下面。

您可能必须先 运行 qdat$from_date <- as.Date(qdat$from_date)

注意:由于 ifelse 发生了奇怪的事情,您得到了这个结果。来自?ifelse:

ifelse() strips attributes

This is important when working with Dates and factors

因此我们需要在 ifelse 调用后恢复 class。

首先通过将 ifelse 更改为正确的调用来修复您的原始代码:

newqdat <- qdat %>% group_by(id) %>%
                    mutate(to_date = ifelse(fobs == 1,
                                            as.Date("2013-12-31"),
                                            as.Date(lead(from_date))))

然后将 class 改回日期:

class(newqdat$to_date) <- "Date"
newqdat