使用dplyr的mutate函数在分组数据框中返回相对值

3

我正在尝试使用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”的观察值分配下一个观察值的from 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

我已经阅读了R-Bloggers上的“快速数据操作的实践dplyr教程”,R-Studio关于“数据科学的语法和图形”的演示,以及其他与dplyr包和相对单元格引用有关的stackoverflow问题,但我还没有找到解决这个问题的方法。值得一提的是,我也很新于R,所以如果我忽略了任何其他人看起来非常明显的东西,我提前表示歉意。

1个回答

2

尝试:

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()会剥离属性
这在使用日期和因子时非常重要
因此,我们需要在ifelse调用后恢复类。
首先通过将ifelse更改为正确的调用来修复原始代码:
newqdat <- qdat %>% group_by(id) %>%
                    mutate(to_date = ifelse(fobs == 1,
                                            as.Date("2013-12-31"),
                                            as.Date(lead(from_date))))

然后将类别更改回日期:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接